具有类型约束的 Haskell 类型族实例

2023-11-21

我试图用类型族表示表达式,但我似乎无法弄清楚如何编写我想要的约束,并且我开始觉得这是不可能的。这是我的代码:

class Evaluable c where
    type Return c :: *
    evaluate :: c -> Return c

data Negate n = Negate n

instance (Evaluable n, Return n ~ Int) => Evaluable (Negate n) where
    type Return (Negate n) = Return n
    evaluate (Negate n) = negate (evaluate n)

这一切都编译得很好,但它并没有准确表达我想要的。在约束条件下Negate的实例Evaluable,我说的是里面表达式的返回类型Negate必须是一个Int (with Return n ~ Int)这样我就可以对它调用否定,但这限制太大了。返回类型实际上只需要是一个实例Num类型类具有negate功能。那样Doubles, Integers,或任何其他实例Num也可以被否定,而不仅仅是Ints。但我不能只写

Return n ~ Num

相反,因为Num是一个类型类并且Return n是一种类型。我也不能放

Num (Return n)

相反,因为Return n是类型而不是类型变量。

我想要用 Haskell 做的事情是可能的吗?如果不是,应该是,还是我误解了它背后的一些理论?我觉得Java可以添加这样的约束。让我知道这个问题是否可以更清楚。

编辑:谢谢大家,你们的回复很有帮助,并且得到了我的怀疑。看来类型检查器无法在没有 UndecidableInstances 的情况下处理我想做的事情,所以我的问题是,我想表达的内容真的是不可判定的吗?它适用于 Haskell 编译器,但它是通用的吗?也就是说,是否存在一个约束,意味着“检查 Return n 是否是 Num 的一个实例”,这对于更高级的类型检查器来说是可判定的?


事实上,你完全可以按照你提到的做:

{-# LANGUAGE TypeFamilies, FlexibleContexts, UndecidableInstances #-}

class Evaluable c where
    type Return c :: *
    evaluate :: c -> Return c

data Negate n = Negate n

instance (Evaluable n, Num (Return n)) => Evaluable (Negate n) where
    type Return (Negate n) = Return n
    evaluate (Negate n) = negate (evaluate n)

Return n当然是一个类型,它可以是一个类的实例,就像Int能。您的困惑可能在于约束的参数是什么。答案是“任何类型正确的东西”。那种Int is *,就像是那种Return n. Num有善良* -> Constraint, so anything同类*可以作为它的论点。写是完全合法的(尽管是空洞的)Num Int作为约束,同样的方式Num (a :: *)是合法的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有类型约束的 Haskell 类型族实例 的相关文章

  • ExtJS GridPanel 中的垂直滚动条

    我正在开发一个项目 其中页面上有一个 GridPanel 该面板可以显示任意数量的行 并且我设置了 autoHeight 属性 这会导致 GridPanel 扩展以适合行数 我现在想要一个水平滚动条 因为在某些分辨率下 并非所有列都会显示
  • Microsoft Graph API 调用无限期挂起

    我正在尝试使用 Microsoft Graph 查询 Azure Active Directory 用户信息 我可以很好地进行身份验证 但是当我尝试查询用户信息时client Users我的应用程序无限期挂起 没有超时 没有错误 只是挂起
  • 如何将 Redux DevTools 扩展添加到我的 React-Redux 商店?

    我正在尝试将 Redux DevTools Chrome 扩展添加到我的 redux 商店 并在此处进行描述 http extension remotedev io http extension remotedev io 这是我的商店 le
  • 反转默认比例梯度ggplot2

    我是新手 我正在尝试设计热图 这是我的代码 ggplot gd aes Qcountry Q6 1 Q6d order TRUE geom tile aes fill prob colour white theme minimal labs
  • Xcode 调试器显示错误的变量值

    我之前问过类似的问题here https stackoverflow com q 53092448 1187415 这个版本有更简单的例子 更新摘要 Xcode 在调试器变量部分中为每个字符串显示 FAIL Swift print 语句显示
  • 为什么 SQL Server 不推荐使用 SET ANSI_PADDING OFF?

    根据 MSDN BOL 在线书籍 SET ANSI PADDING http msdn microsoft com en us library ms187403 aspx 在 Microsoft SQL Server 的未来版本中 ANSI
  • travis-ci 安装程序使用 --github-token 发布

    我在使用带有 github 令牌的安装版本时遇到问题 我喜欢 travis ci 但我不愿意透露我的 github 密码 我需要使用令牌并且我阅读了文档 因为这应该可以通过这种方式实现 不幸的是它仍然要求输入密码 travis login
  • 并行 Haskell - GHC GC 火花

    我有一个正在尝试并行化的程序 带有可运行代码的完整粘贴here http lpaste net 101528 我进行了分析 发现大部分时间都花在findNearest这本质上是一个简单的foldr超过一个大Data Map findNear
  • 如何使用 with open 在 pySpark 中打开存储在 HDFS 中的文件

    如何打开存储在 HDFS 中的文件 这里输入文件来自 HDFS 如果我按如下方式提供文件 我将无法打开 它将显示为找不到文件 from pyspark import SparkConf SparkContext conf SparkConf
  • 是否可以将 Vagrant 与 intelliJ 一起使用?

    假设我正在使用 Java 并使用 IntelliJ 来执行构建和部署等操作以及其他类似操作 我以前没有使用过 Vagrant 但是在运行 Vagrant 实例时是否可以继续使用 IntelliJ 进行构建和部署 是的 您可以将 IDE 与
  • 每次都在django查询数据库中过滤查询集吗?

    想象一下我有以下代码 qs Users objects all list for i in range 10 list append qs filter age i 这里过滤器被调用 10 次 它是连接到数据库 10 次还是第一次使用过滤器
  • 如何对数字进行排序? [复制]

    这个问题在这里已经有答案了 下面是代码 Is the sortNumber对数字进行排序的函数 a 和 b 是什么意思以及为什么存在 为什么sortNumber in n sort sortNumber 没有指定任何参数a and b Ja
  • 如何设置打开文件时默认展开?

    In my vimrc我已经把set foldmethod syntax启用方法折叠等 但是 我不喜欢每次打开文件时都会折叠整个文件的默认设置 有没有办法启用foldmethod 但是当我打开文件时文件是否展开了 set foldlevel
  • 在实体框架中比较日期的最佳方法

    我在实体框架的 where 子句中使用日期并收到以下错误 这是由于以下代码 var entity dbContext MyTable Where w gt w PId 3 w CreatedOn Date mydate Date First
  • django:url 标签 -> 如何使用变量作为 url_name?

    我有一个 django 视图 它声明了一个目标变量 target name of next view to call return render request template locals 我想在我的模板中使用这个目标变量 我尝试了以下
  • 从 Bigcommerce 的浏览器内存中删除注入的分析库?

    我们如何删除这个脚本注入器系统并清除内存中的函数 简报 最近 Bigcommerce 的不法分子以 监控 为幌子创建了一个分析注入器 JS 该注入器被锁定在全局变量中 他们在未经任何 OP 同意的情况下将其推广到所有 50 000 家前台商
  • 当页面加载图像时,它是只加载一次,还是每次在标记中找到它时加载?

    当页面加载图像时 它是只加载一次 还是每次在标记中找到它时加载 那么 jquery 呢 附加一个 img 会导致它再次重新加载吗 我问这个问题是因为我有高分辨率图像 但需要在标记的许多情况下使用它 img src hello jpg img
  • JavaScript Uncaught ReferenceError:jQuery 未定义;未捕获的引用错误:$未定义[重复]

    这个问题在这里已经有答案了 这是我的小提琴http jsfiddle net 4vaxE 35 http jsfiddle net 4vaxE 35 它在我的小提琴中工作得很好 但是 当我将其转移到dreamweaver时 它无法工作 我在
  • Django 无法覆盖表单字段小部件

    我需要在表单中生成基于列的复选框 myapp templates forms widgets custom html div class row for group options index in widget optgroups for
  • 使用 Fetch 发生超时错误 - React Native

    我有一个正在运行的用户登录功能 但是 我想在获取时加入超时错误 有没有办法设置一个 5 秒左右的计时器 这样在这个时间之后就会停止尝试获取 否则 一段时间后我就会出现红屏 提示网络错误 userLogin var value this re

随机推荐

  • 如何从监控摄像头录制的视频中读取时间?

    我有一个问题 我必须从监控摄像头录制的视频中读取录制时间 时间显示在视频的左上角区域 下面是显示时间的区域屏幕截图的链接 此外 数字颜色 白色 黑色 在视频播放期间不断变化 http i55 tinypic com 2j5gca8 png
  • 更新 .dbml 文件

    在数据库中进行一些更改后如何更新 dbml 文件 进行更改后没有内置方法可以将 dbml 文件 数据上下文与数据库同步 除了通过删除所有或部分实体并重新拖动它们来重新生成整个 dbml 文件之外 或者按照其他回复的建议使用 sqlmetal
  • Python - 找到最近的时间戳

    我有一个 Python 日期时间时间戳和一个大字典 索引 其中键是时间戳 值是我感兴趣的其他一些信息 我需要尽可能高效地找到索引中最接近时间戳的日期时间 键 目前我正在做类似的事情 for timestamp in timestamps c
  • .net MAUI 背景 vs 背景颜色 - 有什么区别?

    使用 Visual Studio Community Edition 2022 构建 Net MAUI 项目 我尝试搜索官方文档 但没有找到答案 有人可以解释以下内容吗 问题 有什么区别Background and BackgroundCo
  • SQL表连接中ON和WHERE子句的区别

    select e last name e hire date from employees e join employees m on m last name Davies and e hire date gt m hire date se
  • ActionFilterAttribute ninject 注入 - DbContext 已被处置

    我的项目使用通常的存储库模式以及服务和工作单元 所有这些都使用 Ninject 从 NinjectModule 注入依赖项 但我正在尝试从ActionFilterAttribute在我显示的页面布局中注入一些信息 来自数据库 这样我就不需要
  • 使用 JavascriptExecutor 的 Selenium Datepicker

    请告知是否接受使用 Selenium 的取货日期这种方法 WebDriver driver new ChromeDriver driver manage window maximize driver get https www spicej
  • 熊猫的重采样从几个月到几周

    我正在尝试将每月数据下采样为每周数据 并拥有如下所示的月份时间序列数据框 qty PERIOD NAME 2017 09 01 49842 0 2017 10 01 27275 0 2017 11 01 29159 0 2017 12 01
  • 在 Asio 中异步等待,直到套接字可用于读/写

    我想用 Boost Asio 执行以下操作 我有一个套接字 我想注册一个回调 当数据可用于在套接字上读取 写入时调用 但我不希望它实际执行读取 写入操作 基本上 我需要的类似于async read some async write some
  • 尝试在地图函数中添加字段时出现“对象不可扩展”错误

    我尝试使用地图向数组中的项目添加新字段 const newArray oldArray map item gt return item newField Something 我已经尝试过 const newArray oldArray ma
  • Maven:Surefire——干运行?

    有什么办法可以保证干运行吗 会列出哪些测试的东西would运行 而不运行它们 目标是了解在特定配置下哪些测试将在 JBoss AS7 测试套件中运行 Janinko 进行了更改 位于https github com janinko mave
  • Command.ExecuteScalar 始终返回 null,而 Management Studio 中的存储过程运行良好

    我有以下 SQL 存储过程 其中包含一个输入参数和一个输出参数 CREATE PROCEDURE dbo spCanUserEdit username nvarchar 255 AS BEGIN SET NOCOUNT ON DECLARE
  • 垂直居中 UILabel 时忽略上升和下降?

    我使用自动布局将一些标签放置在单元格的垂直中心 文本全部大写 但UILabel有问题时 即使sizeToFit应用后 会在文本下方留下空格 这看起来很像小写 y p 和 q 等字母的尾部 由于我垂直居中 这会导致偏移 意味着文本显示比应有的
  • 如何在 Laravel 中读取 FormData 对象

    我正在尝试将 ajax 提交表单到 Laravel 5 控制器方法 据我所知 在 php 中 您可以定义一个 FormData 对象 将输入字段附加到该对象并将其发送到服务器 您现在可以在其中使用输入字段名称提取值 Like so var
  • 在回溯中没有“引发”的情况下引发异常? [复制]

    这个问题在这里已经有答案了 可能的重复 不要在异常堆栈中显示 Python raise line 内置异常 例如NameError等给我一个回溯到我的代码中发生异常的点 我正在开发一个实用程序模块 它让我感到烦恼 如果使用我的模块的代码引发
  • 在 PHP 中包含文件的最佳方式?

    我目前正在开发一个 PHP Web 应用程序 我想知道以代码仍然可维护的方式包含文件 include once 的最佳方式是什么 通过可维护 我的意思是 如果我想移动文件 很容易重构我的应用程序以使其正常工作 我有很多文件 因为我尝试拥有良
  • 提高 OpenCV HOG 人体检测器的准确性

    我正在一个项目中工作 项目的一部分包括将 OpenCV 的 HOG 人体检测器与摄像机流集成 目前它正在使用相机和基本的 HOG 检测器 CPP detectorMultiScale gt http docs opencv org modu
  • java.lang.NullPointerException: CameraUpdateFactory 未初始化 logcat 异常

    我正在使用 Google 地图 我能够成功创建并显示 Google 地图 现在我想添加CameraUpdate latitude longitude 我用谷歌搜索 找到了一些源代码 但我得到了NullPointerException Log
  • 如何独占锁定阻止 CRUD 操作的行

    专家您好 我如何锁定 sql server 中的一行以阻止 CRUD 操作甚至 SELECT 是否可以 可串行化隔离级别不会阻止 SELECT 谢谢 BEGIN TRAN SELECT 1 FROM Table WITH XLOCK ROW
  • 具有类型约束的 Haskell 类型族实例

    我试图用类型族表示表达式 但我似乎无法弄清楚如何编写我想要的约束 并且我开始觉得这是不可能的 这是我的代码 class Evaluable c where type Return c evaluate c gt Return c data