为数据类型定义自己的 Ord

2024-02-15

我正在尝试制作一些数据结构来解决图形难题。我正在尝试定义边缘的比较标准,但我不确定如何定义。迄今为止:

data Edge = Edge (Set String) Bool

如果边缘具有相同的字符串集,并且相等与布尔值没有任何关系,我如何“通知”编译器我希望将边缘声明为相等?


虽然我不确定为什么你想忽略布尔值(我很好奇),但要做到这一点,你必须定义自己的Eq实例;默认值不起作用,因为它会比较每个字段。幸运的是,这很容易:

instance Eq Edge where
  (Edge s1 _) == (Edge s2 _) = s1 == s2

如果您希望能够对边进行排序,并且希望排序也仅比较集合,那么您的实现非常相似:

instance Ord Edge where
  (Edge s1 _) `compare` (Edge s2 _) = s1 `compare` s2

每个类型类都定义了一组需要实现的方法;Eq需要== or /=, and Ord需要<= or compare。 (要了解哪些功能是必需的,哪些是可选的,您可以查看文档。)

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

为数据类型定义自己的 Ord 的相关文章

  • RankN多态性和令人发指的克莱斯利之箭

    我不明白为什么 demobind1 的定义会产生一些编译器错误 它看起来像一个愚蠢的翻转 但不知何故 LANGUAGE GADTs LANGUAGE RankNTypes ScopedTypeVariables TypeOperators
  • Haskell 项目可以使用 cmake 吗?

    我正在计划一个用 Haskell 编写的项目 也许也有一些部分是用 C 编写的 对于构建系统 我决定不选择 Haskell 程序 cabal 的常见选择 主要是因为我想了解其他语言的构建程序是如何工作的 我听说过 CMake 我认为这是一个
  • 函数式语言中的部分求值和函数内联有什么区别?

    我知道 函数内联就是用函数定义代替函数调用 部分评估是在编译时评估程序的已知 静态 部分 在 C 等命令式语言中 两者之间存在区别 其中运算符与函数不同 但是 在像 Haskell 这样的函数式语言 其中运算符也是函数 中 两者之间有什么区
  • 在 ghci 下执行 `(read "[Red]") :: [Color]` 时会发生什么?

    我正在阅读以下小节现实世界 Haskell 第 6 章 类型类 http book realworldhaskell org read using typeclasses html关于一个实例Read for Color 它实现了reads
  • 如何将列表转换为地图?

    最近我和一位同事讨论了转换的最佳方式是什么List to Map在 Java 中 这样做是否有任何具体的好处 我想知道最佳的转换方法 如果有人可以指导我 我将非常感激 这是个好方法吗 List
  • Scheme (Lisp) 中树的深度反转

    我对Scheme中的基本树数据结构进行了深度逆向 define deep reverse t cond null t not pair t t else cons deep reverse cdr t deep reverse car t
  • 如何构建一棵与或树?

    我需要一个支持 与 和 或 的树结构 例如 给定一个正则表达式 如ab c d e 我想把它变成一棵树 所以 一开始我们有两个 或 分支 它可以向下ab or c d e 如果你低头ab分支 你得到两个节点 a and b or a其次是b
  • 如何只修改记录的一个字段而不完全重写它? [复制]

    这个问题在这里已经有答案了 It s the second time I m tackling this problem And for the second time this is while working with the Stat
  • Haskell 中多核编程的现状如何?

    Haskell 中多核编程的现状如何 现在有哪些项目 工具和库可用 有哪些经验报道 2009年至2012年期间 发生了以下事件 2012 从 2012 年开始 并行 Haskell 状态更新开始出现在并行 Haskell 摘要 http w
  • 在大文件中查找重复项

    我有一个非常大的文件 大约有 1500 万个条目 文件中的每一行都包含一个字符串 称为键 我需要使用 java 查找文件中的重复条目 我尝试使用哈希图并检测重复的条目 显然 这种方法向我抛出了 java lang OutOfMemoryEr
  • 并行 Haskell - GHC GC 火花

    我有一个正在尝试并行化的程序 带有可运行代码的完整粘贴here http lpaste net 101528 我进行了分析 发现大部分时间都花在findNearest这本质上是一个简单的foldr超过一个大Data Map findNear
  • 这是 unsafeCoerce 的安全使用吗?

    我遇到的情况是 我目前正在使用极其可怕的函数 unsafeCoerce 幸运的是 这并不是为了任何重要的事情 但我想知道这是否是该函数的安全使用 或者是否有其他方法可以解决其他人知道的这个特定问题 我的代码类似于以下内容 data Toke
  • 与 Functor 不同,Monad 可以改变形状?

    我一直很喜欢以下关于单子相对于函子的力量的直观解释 单子可以改变形状 函子不能 例如 length fmap f 1 2 3 总是等于3 然而 对于单子来说 length 1 2 3 gt gt g往往不等于3 例如 如果g定义为 g Nu
  • 在 Archlinux 上使用 Vim 作为 Haskell 的 IDE 目前情况如何?

    如果可行的话 我的目标是通过 YouCompleteMe 在 Vim 中完成 Haskell 的命令 在这方面 正如您在下面看到的 我还没有找到关于如何让它发挥作用的共识 相关评论的最新评论YouCompleteMe 上的问题 https
  • Haskell 中的内部爆炸模式是否总是强制使用外部构造函数?

    在 Haskell 中 是否存在对于数据类型 LANGUAGE BangPatterns import Control DeepSeq data D D Int 实例 instance NFData D where rnf D 与具有另一个
  • 为什么 GHC 在这里推断出单态类型,即使禁用了单态限制?

    这是由解析 f f pure 的类型 https stackoverflow com questions 55388119 resolving the type of f f pure 55388309 noredirect 1 comme
  • 将“Functor”类泛化为“MultiFunctor”?

    我正在学习 自由应用函子 https arxiv org pdf 1403 0749 pdf 当然 我要问的问题有点偏离论文的主要思想 但仍然 第 6 页试图概括Functor to MultiFunctor class Functor f
  • 当约束成立时,将没有约束的 GADT 转换为另一个有约束的 GADT

    我们能否将构造函数没有给定约束的 GADT 转换为具有上述约束的 GADT 我想这样做是因为我想要深度嵌入箭头并用 目前 似乎需要的表示做一些有趣的事情Typeable 一个理由 https stackoverflow com a 1223
  • Haskell:确定函数数量的函数?

    可以写一个函数吗arity a gt Integer确定任意函数的数量 使得 gt arity map 2 gt arity foldr 3 gt arity id 1 gt arity hello 0 是的 这可以非常非常容易地完成 ar
  • 为什么对本地列表求和比用“GHC -O2”对教会编码列表求和慢?

    为了测试教会编码的列表如何针对用户定义的列表和本机列表执行 我准备了 3 个基准测试 用户定义的列表 data List a Cons a List a Nil deriving Show lenumTil n go n Nil where

随机推荐

  • 低端设备支持 ARKit 吗?

    在Apple的演示中 他们说如果不支持ARWorldTrackingConfiguration 我们可以使用较小的AROrientationTrackingConfiguration 以前称为ARSessionConfiguration 但
  • 拒绝访问文件夹但允许访问该文件夹内的文件

    我想拒绝匿名用户访问文件夹 test 但排除并允许访问测试文件夹内的文件 webform1 为什么这不起作用
  • jQuery 鼠标滚轮不支持触控板?

    我用的是流行的鼠标滚轮 https github com brandonaaron jquery mousewheel插件来模拟全页滚动 例如这个网站 http onlinedepartment nl values jQuery funct
  • 了解 CComBSTR 赋值运算符

    假设我有以下内容 BSTR myBSTR SysAllocString L MYBSTR CComBSTR myCComBSTR myBSTR Does myCComBSTR取得所有权myBSTR当它超出范围时释放它 或者它是否复制了myB
  • 无法加载动态库“libcublasLt.so.11”; dlerror: libcublasLt.so.11: 无法打开共享对象文件: 没有这样的文件或目录

    我刚刚更新了我的显卡驱动器 sudo apt install nvidia driver 470 sudo apt install cuda drivers 470 我决定以这种方式安装它们 因为它们在尝试安装时受到阻碍sudo apt u
  • 在C中获取文件扩展名

    如何获得文件扩展名 例如 tiff 来自 C 中的文件名 Thanks const char get filename ext const char filename const char dot strrchr filename if d
  • 从 url 不变的网站中抓取响应表

    我希望从该网站抓取价格历史记录 单击价格历史记录按钮后 表格将被加载 但网址保持不变 我想刮掉桌子上的负载 import requests from bs4 import BeautifulSoup rr requests get url
  • Angular4:用户的区域设置

    我想要一个登录表单 并在该用户输入应用程序后 使用德语或英语使用 据我了解 我可以设置app module ts就像是 import LOCALE ID from angular core providers provide LOCALE
  • 使用 iTextSharp 设置页边距

    我有一个 PDF 模板文件 其中嵌入了一个 PDF 表单字段 我正在使用 PdfStamper 来填写这些字段 此外 我希望能够更改生成的 PDF 的边距 有什么方法可以修改已盖章的 PDF 上的页边距吗 您可以在一行中完成所有操作 Doc
  • 导入文本文件时跳过空文件

    我有一个包含大约 700 个文本文件的文件夹 我想要导入这些文件并向其中添加一列 我已经弄清楚如何使用以下代码来做到这一点 files list files pattern c txt DF lt NULL for f in files d
  • Pandas 交叉表和计数

    我正在使用 Python 熊猫 我有一个带有字符串的列 我想在列之间进行交叉 例如我有以下输入 1 Andi 2 Andi Cindy 3 Thomas Cindy 4 Cindy Thomas 我想要以下输出 因此 安迪和托马斯的组合没有
  • Scala 参与者与非参与者交互(或将消息从参与者同步到 servlet)

    我有以下 scala 代码 package dummy import javax servlet http HttpServlet HttpServletRequest gt HSReq HttpServletResponse gt HSR
  • 异常在构造函数 try 块中捕获并处理,但仍会再次重新抛出

    我试图更好地理解处理继承时的抛出 捕获机制 我试图解决的问题是 如果在构造派生类时 首先构造的基类抛出异常 将会发生什么情况 include
  • CSS Margin: 0 未设置为 0

    我是网页设计的新手 我使用 CSS 和 HTML 创建了网页布局 如下所示 问题是 即使我将边距设置为 0 上边距也没有设置为 0 并留下了一些空间 我怎样才能清除这个空白区域 问题的屏幕截图 样式表
  • 使用 php 为 apache 日志设置 REMOTE_USER

    在 mod perl 中我可以做类似的事情 r gt user username 然后用户名将显示在日志的用户名部分中 有没有办法在 php 中做到这一点 无需修改apache Edit 到目前为止我已经尝试过两种 SERVER REMOT
  • 为什么 string.split() 结果包含未定义?

    我想在其中一个上分割一个字符串 d or n 我能够成功地分割这两者之一 但不能同时分割 gt msg foo 1 bar n baz 2 gt msg split d foo 1 bar baz 2 gt msg split n foo
  • 在 POST 负载中使用环境变量

    我可以在我发布的有效负载中使用先前测试中设置的环境变量吗 eg POST list some key environment saved value 是的 你可以这么做 你这样发送 some key environment variable
  • Python print 语句在参数之间添加空格

    我正在编写一个非常基本的 hello 程序 但我在名称和第一个感叹号之间不断出现空格 而我在代码中没有看到该空格 我尝试用几种不同的方式重新格式化字符串部分来连接间距 但我无法弄清楚是什么导致了额外的空间 我尝试过单独使用感叹号 或者将其作
  • 在 CUDA 内核中声明变量

    假设您在 CUDA 内核中声明一个新变量 然后在多个线程中使用它 例如 global void kernel float delt float deltb int i blockIdx x blockDim x threadIdx x fl
  • 为数据类型定义自己的 Ord

    我正在尝试制作一些数据结构来解决图形难题 我正在尝试定义边缘的比较标准 但我不确定如何定义 迄今为止 data Edge Edge Set String Bool 如果边缘具有相同的字符串集 并且相等与布尔值没有任何关系 我如何 通知 编译