Haskell:标准库是否假设 Eq 和 Ord 兼容?

2023-12-30

这是一个后续问题Eq 和 Ord 实例不一致? https://stackoverflow.com/questions/17114899/inconsistent-eq-and-ord-instances.

本质上的问题是:当声明时Eq and Ord类型的实例,必须确保compare x y回报EQ当且仅当x == y回报True?创建打破这一假设的实例是否危险?这似乎是人们可能假设的一种自然法则,但它似乎没有在前奏中明确说明,不像例如单子或函子定律。

基本的回应是:这样做有点危险,因为图书馆可能会认为这条定律成立。

我现在的问题是:执行任何标准库(特别是,Set or Map)做出这个假设?具有不兼容的类型是否危险Eq and Ord,只要我只依赖 GHC 提供的标准库?(如果大问题仍然可以接受,我会问:哪些常用的库遵循这一定律?)

Edit.我的用例与原始问题的用例类似。我有一个带有自定义实例的类型Eq,我用了很多。我想要的唯一理由Ord这样我就可以将它用作 a 的域Map;我不关心具体的顺序,也永远不会在代码中显式地使用它。所以如果我可以使用派生实例Ord,那么我的生活会更轻松,我的代码也会更清晰。


的定义Ord本身在标准前奏 http://www.haskell.org/onlinereport/standard-prelude.html要求已经有一个Eq实例:

class  (Eq a) => Ord a  where
    ...

所以违反同样是错误的

    x == y           =  compare x y == EQ
    x /= y           =  compare x y /= EQ

因为这将违反(来自 Ord 中这些运算符的默认定义)。

    x <= y           =  compare x y /= GT
    x <  y           =  compare x y == LT
    x >= y           =  compare x y /= LT
    x >  y           =  compare x y == GT

编辑:在图书馆中使用

如果标准库不使用,我会感到非常惊讶Ord's == and /=运营商。特定目的运营商(==, /=, <=, <, >=, >)通常比compare,所以我希望看到它们在代码中使用maps or filters.

You can see ==用于钥匙防护Data.Map在 fromAscListWithKey 中 http://www.haskell.org/ghc/docs/latest/html/libraries/containers-0.5.0.0/src/Data-Map-Base.html。此特定功能仅调用Eq类,但如果键也是Ord实例,Ord's compare将用于结果的其他功能Map,这是一个假设Eq's ==是相同的Ord's compare并测试EQ.

作为一名库程序员,如果任何特殊用途运算符表现出色,我不会感到惊讶compare为了特定的目的。毕竟,这就是为什么他们是Eq and Ord类而不是被定义为所有的多态Eq or Ord实例。我可能会强调使用它们,即使compare比较方便。如果我这样做,我可能会定义类似的内容:

compareOp :: (Ord a) => Ordering -> Bool -> a -> a -> Bool
compareOp EQ True  = (==)
compareOp EQ False = (/=)
compareOp LT True  = (<)
compareOp LT False = (>=)
compareOp GT True  = (>)
compareOp GT False = (<=)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Haskell:标准库是否假设 Eq 和 Ord 兼容? 的相关文章

随机推荐

  • 在构建时更新 dSYM 中的 CFBundleShortVersionString?

    我将其用作项目中的构建阶段 export PLISTBUDDY usr libexec PlistBuddy export INFO CODESIGNING FOLDER PATH Info plist export RXREVISION
  • 是否可以向在参数中传递的提交按钮添加一个值?

    我正在尝试向我的应用程序添加 预览 按钮 页面 有没有一种方法可以向我的 发布 和 预览 提交按钮添加不同的值 这些按钮在参数哈希中传递 以便我可以检查在控制器中按下了哪个按钮并相应地渲染视图 这是最好的方法吗 的按键params哈希只是n
  • C++:友元声明‘声明非模板函数

    我遇到了超载问题 lt lt 流运算符 我找不到解决方案 template
  • Keras - model.evaluate() 和 model.predict() 之间有什么区别

    我有两个问题 1 model evaluate 和 model predict 有什么区别 2 Keras 如何计算其中每一项 model evaluate预测值并计算给定数据集上模型的损失和所有附加指标 它返回一个列表 其中包含一个值中的
  • File.ReadLines 没有锁定吗?

    我可以用以下命令打开 FileStream new FileStream logfileName FileMode Open FileAccess Read FileShare ReadWrite 无需锁定文件 我可以做同样的事情File
  • 注意:使用未定义的常量 ENT_HTML5 - 假定为“ENT_HTML5”

    我正在尝试创建一个接受 htmlspecialchars 参数的简单方法 虽然我收到 PHP 通知 使用未定义的常量 ENT HTML5 假定为 ENT HTML5 有什么想法可能导致这种情况吗 Encode string param ar
  • 乘客问题 - Apache

    在 Ubuntu 10 04 LTS 的 Linode 切片中运行 我收到 500 内部服务器错误 Apache 日志有 Apache 2 2 14 Ubuntu Phusion Passenger 2 2 7 配置 恢复正常操作 捕获 S
  • Django 返回带有 L 的用户模型 ID

    这个问题直到现在才出现 这里是 当我尝试从用户模型获取用户 ID 时 它返回用户 ID 和字母 L gt gt gt from django contrib auth models import User gt gt gt u User o
  • Java:如果我的程序有一个实例正在运行,我如何检测它,然后关闭旧的实例

    我只想运行我的程序的一个实例 但我希望它能关闭旧的 如果它们打开的话 这是在Java中 如果应用程序是使用启动的Java网络启动 http www java com en download faq java webstart xml它可以访
  • 我可以以编程方式列出 Images.xcassets/Something 中的文件吗?

    是否可以列出 Images xcassets Something 中的所有图像 以便我可以在表格列表视图中显示它们 我试过了 NSArray pngs NSBundle pathsForResourcesOfType png inDirec
  • 如何使用 DropZone.js 获得更高质量的缩略图?

    我正在使用 DropZone 将文件上传到我的服务器 默认设置就可以了 但是照片有点小 我决定进入 dropzone css 文件并将默认参数更改为 250px x 250 px 而不是 100px x 100px dropzone pre
  • spring-data-redis Jackson 序列化

    我正在尝试使用 spring data redis 的 Jackson 序列化功能 我正在构建一个 ObjectMapper 并使用 GenericJackson2JsonRedisSerializer 作为 redisTemplate 的
  • 短变量声明和“声明变量但未使用”错误

    我偶然发现了一个奇怪的问题 以下代码无法编译 func main var val reflect Value var tm time Time if tm err time Parse time RFC3339 2018 09 11T17
  • 使用netty高速发送消息时出现OOM异常

    我用netty编写了一个客户端 以便以高速率发送消息 通过 jConsole 我看到 老一代 正在增加 最后它抛出 java lang OutOfMemoryError 超出 GC 开销限制 是否有一些方法或配置可以避免此异常 以下是我的测
  • 管理每周时间表的数据库架构

    我写这篇文章是因为我想知道是否有人可以帮助我找出简单时间表应用程序的最佳数据库架构 我不知道如何绘制表格来帮助我代表一年中的几周 所有用户都将在其中记录他们每周的工作时间 干杯 非常感谢您的帮助 吉列尔莫 我将与您分享我们使用的一个典型模型
  • Scala 元组的通用“映射”函数?

    我想使用返回类型 R 的单个函数来映射 Scala 元组 或三元组 的元素 结果应该是具有 R 类型元素的元组 或三元组 好的 如果元组的元素来自相同类型 则映射不是问题 scala gt implicit def t2mapper A t
  • 灰度图像中像素的质心

    我正在开发一个程序 让用户在 涂鸦区域 绘制一个数字 按下按钮 应用程序将使用神经网络分类器预测他输入的数字 现在 为了训练神经网络 我使用了 MNIST 数据库 其中指定了以下内容 NIST 中的图像经过尺寸标准化以适合 20x20 像素
  • 使用 Fetch API 时捕获“无法加载资源”

    我试图在使用 Fetch API 时捕获一堆与同源策略相关的错误 但没有成功 window onerror message file line col error gt console log error window addEventLi
  • Excel VBA 登录 IE 站点

    我是一名 VBA 新手 也是 Stack Overflow 的新手 尽管我已经阅读这里的帖子有一段时间了 我已经搜索了很多编码问题的答案 但似乎找不到答案 我正在尝试登录网站 导航到页面 然后从该页面抓取数据 我已经开始构建我从互联网上找到
  • Haskell:标准库是否假设 Eq 和 Ord 兼容?

    这是一个后续问题Eq 和 Ord 实例不一致 https stackoverflow com questions 17114899 inconsistent eq and ord instances 本质上的问题是 当声明时Eq and O