为什么 Haskell 没有比 Eq 更强大的替代方案?

2023-12-12

之所以Set不是给定函子here。似乎可以归结为这样一个事实:a == b && f a /= f b是可能的。那么,为什么 Haskell 没有 Eq 的标准替代品,比如

class Eq a => StrongEq a where
    (===) :: a -> a -> Bool
    (/==) :: a -> a -> Bool
    x /== y = not (x === y)
    x === y = not (x /== y)

哪些情况应该遵守法律

∀a,b,f. not (a === b) || (f a === f b)
∀a. a === a
∀a,b. (a === b) == (b === a)

也许还有其他一些?那么我们可以有:

instance StrongEq a => Functor (Set a) where
    -- ...

或者我错过了什么?


Edit:我的问题不是“为什么有些类型没有Eq例如?”,就像你们中的一些人似乎已经回答了一样。恰恰相反:“为什么会有这样的例子?Eq不是外延相等的吗?为什么有太多Eq实例?”,与“如果a == b确实意味着外延平等,为什么Set不是一个实例Functor?”.

另外,我的实例声明是垃圾(感谢@n.m.)。我应该说:

newtype StrongSet a = StrongSet (Set a)
instance Functor StrongSet where
    fmap :: (StrongEq a, StrongEq b) => (a -> b) -> StrongSet a -> StrongSet b
    fmap (StrongSet s) = StrongSet (map s)

instance StrongEq a => Functor (Set a) where

无论在 Haskell 中还是在事物的宏大数学/分类方案中,这都没有意义,无论什么StrongEq means.

在哈斯克尔中,Functor需要 kind 的类型构造函数* -> *。箭头反映了这样一个事实:在范畴论中,函子是一种映射。[]和(假设的)Set是这样的类型构造函数。[a] and Set a有善良*并且不能是函子。

在 Haskell 中,很难定义Set从而可以将其制成Functor因为无论如何都无法为某些类型合理地定义相等性。你不能比较两种类型的东西Integer->Integer, 例如。

假设有一个函数

goedel :: Integer -> Integer -> Integer
goedel x y = -- compute the result of a function with 
             -- Goedel number x, applied to y

假设你有一个值s :: Set Integer. What fmap goedel s应该是什么样子?如何消除重复项?

在典型的集合论中,平等被神奇地定义为一切,包括函数,所以Set (or Powerset准确地说)是一个函子,这没问题。

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

为什么 Haskell 没有比 Eq 更强大的替代方案? 的相关文章

  • Haskell 中的分类结构

    Hask通常被认为是一个范畴 其对象是类型 态射是函数 然而 我看到 Conor McBride pigworker 警告不要使用Hask多次 1 https stackoverflow com a 45905082 474311 2 ht
  • 理解 Scala FP 库

    只是为了让那些想要开始使用 Scala FP 库 在纯 FP 方面变得更好的人快速清晰地了解 有人能澄清猫和猫效应 猫效应 IO 之间的区别 关系吗 最重要的是 齐奥和莫尼克斯对此有何看法 最后 与 ScalaZ 7 8 有何关系 到目前为
  • “功能性”Rust 对性能有哪些影响?

    我正在关注 Rust 轨道运动 io https exercism io 我有相当多的 C C 经验 我喜欢 Rust 的 功能 元素 但我担心相对性能 我解决了 行程编码 问题 https exercism io tracks rust
  • 在scala 2.13中,为什么有时无法显式调用类型类?

    这是 Shapeless 2 3 3 中的一个简单示例 val book author gt gt Benjamin Pierce title gt gt Types and Programming Languages id gt gt 2
  • Haskell 入门

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 几天来 我一直试图理解 Haskell 中的函数式编程范例 我通过阅读教程和观看截屏视频
  • 标准的能力

    我发现了一些使用标准的旧例子here http www serpentine com blog 2009 09 29 criterion a new benchmarking library for haskell 看起来好像早在 2009
  • 如何在 Haskell 中制作打勾游戏的图案?

    实现有 2 个参数的函数 ticktick 第一个参数是自然数元组 定义游戏场地的行数和列数 第二个列表包含由玩家 x 和玩家 o 轮流玩的坐标给出的井字游戏比赛的记录 打印游戏的实际状态 其中游戏区域将由字符 和 界定 空方块 以及字符
  • QuickCheck是否可以生成任意函数

    我试图为身份编写一个 QuickCheck 测试 f y f y 我最初的计划是编写一个返回函数和整数的任意生成器 具有签名Gen Int gt Int Int 并在prop DollerDoesNothing使用 不使用测试该功能应用程序
  • 如何在haskell中获取变量名称

    我来到 haskell 时有一些 c 背景知识 想知道是否有类似的 define print a printf s d n a a int a 5 print a 应该打印 a 5 这是 augustss 提到的 TH 解决方案 LANGU
  • : 中缀运算符在 Haskell 中的作用是什么?

    我正在阅读Haskell 简要介绍 http www haskell org tutorial index html 这不是那么温和 并且它反复使用 操作符而不直接解释它的作用 那么 它到底有什么作用呢 是 前置 运算符 x xs 返回一个
  • 在管道中重用变量的功能方式

    在 javascript 和 typescript 中与 Ramda 一起使用函数式编程 我经常发现自己编写如下代码 const myFun c gt const myId c id const value pipe getAnotherO
  • 如何通过“cabal build”或“stack build”构建带有图标的项目

    我想构建一个带有图标的可执行文件 通过谷歌搜索 我发现这里的说明 https wiki haskell org Setting an executable icon 但它只能通过编译源文件来工作ghc 如果我想构建一个具有可执行文件的项目c
  • 检查对以下内容的理解:“变量”与“变量” “价值”、“功能”与“抽象”

    这个问题是后续问题this one https stackoverflow com questions 25327705 is function a sort of variable 25329157 25329157在学习 Haskell
  • Haskell:不在范围内:数据构造函数

    今天开始在学校学习 haskell 我遇到了函数问题 我不明白为什么它不在范围内 代码如下 ff Char gt Char gt Char ff A B x 0 y 1 x lt A y lt B x 1 y 0 和错误 md31 hs 2
  • 如何在不改变也不重新分配的情况下实现可设置和可检索的状态?

    编写代码时可以遵循以下几条规则 当没有重新分配时 代码更容易阅读和推理 许多 linter 推荐首选const只要有可能 代码也更容易阅读和推理对象何时不会发生变化 如果您在代码的一部分中定义了一个对象 那么知道您可以在其他地方自由引用该对
  • 管道:多个流消费者

    我编写了一个程序来计算语料库中 NGram 的频率 我已经有一个函数 它消耗一串令牌并生成一个订单的 NGram ngram Monad m gt Int gt Conduit t m t trigrams ngram 3 countFre
  • 如何在Haskell中实现词法分析器和解析器

    我在这里得到了这段代码 它是用Haskell结构的命令式编程语言编写的程序 所以问题是 我如何为这种语言实现词法分析器和解析器 该程序被定义为一系列语句有 6 种类型 goto write stop if goto 和 int int n
  • @tailrec为什么这个方法不编译为“包含不在尾部位置的递归调用”?

    tailrec private def loop V key String V key match case gt loop key 此方法无法编译并抱怨它 包含不在尾部位置的递归调用 有人可以向我解释一下发生了什么事吗 这个错误消息对我来
  • C++ 概念与 Haskell 类型类有何不同?

    Concepts TS 中的 C 概念最近已合并到 GCC 主干中 概念允许人们通过要求类型满足概念的条件 例如 可比较 来约束通用代码 Haskell 有类型类 我对 Haskell 不太熟悉 概念和类型类如何相关 概念 由概念 TS 定
  • 迭代打印列表中的每个整数

    假设我有一个整数列表l 1 2 我想打印到stdout Doing print l产生 1 2 假设我想打印不带大括号的列表 map print l产生 No instance for Show IO arising from a use

随机推荐

  • symfony 的 require_once

    我现在正在使用 php Symfony2 框架进行制作 并且我有以下代码 require once one file php require once another file php 等等 问题是 如何将这些不舒服的require语句 S
  • CSS 文本填充差异 Firefox 与 Chrome 等

    如果有人可以在以下方面提供帮助 我将不胜感激 因为我花了整个晚上在这个问题上没有结果 我有一个网站 我想在每篇文章之后修改标签外观 问题在于 firefox 版本 14 0 1 为文本提供了较小的高度 总 高度为 15px icnludin
  • 访问作为泛型类型传递的类属性

    我有两个类 它们被传递给序列化方法 我想在序列化方法中访问这些类的两个属性 问题是序列化方法参数作为泛型类型传递 我不知道在这种情况下如何访问传递的类的属性 下面的例子 public class MyClass1 public string
  • 在另一个框架的上下文中运行 JQuery

    我正在合作的客户有一个像这样的框架集 当发生某个操作时 我需要我的框架 当前隐藏的重要框架 主要接管页面并阻止与其他框架的任何交互 我计划使用 jquery block UI 插件来阻止交互 问题是我实际上无法更改 foo ht
  • 如何将结果写入JTextArea

    我有问题 如何将结果 数据库选择写入 JTextArea 我的 JButton 的方法是 public void actionPerformed ActionEvent evt try Class forName com mysql jdb
  • 使用 Graph API 获取所有 Facebook 好友

    我尝试获取 me friends 返回的 JSON 包含的朋友比我的 Facebook 页面显示的少 3 个 事实证明 对于这 3 个 GET id 返回 false 而不是有效的 JSON 对象 尽管我没有看到它们有什么特别之处 只是它们
  • Mongodb find查询返回空数组

    我试图通过代码 id 获取产品 但结果是空数组 我的控制器 export const getProductByPLU async req res gt const searchPLU req query try const product
  • 自动滚动jetpack compose中后面的项目

    我有一个3 Column In 1st Column的组件是2nd and 3rd Column In 2nd Column里面有很多组件 最后3rd Column我有一些项目 但我停留在屏幕底部 我已经在这个的帮助下完成了answer 在
  • 与 PhP 一起使用的 AMP 表单

    我正在尝试使用 AMP 设置带有联系表单的页面 该表单只有 4 个字段 Name Email 我们能帮你什么吗 电话号码 然后我希望将该信息发送到我的电子邮件地址 这是我在 HTML 中的信息 h4 How can we help h4
  • scala - 泛型中的任何与下划线

    Scala 中以下泛型定义有何不同 class Foo T lt List and class Bar T lt List Any 我的直觉告诉我它们大致相同 但后者更明确 我发现前者可以编译但后者不能编译的情况 但无法指出确切的差异 Th
  • Ruby 中日期时间和时间的区别

    有什么区别DateTime and TimeRuby 中的类以及哪些因素会导致我选择其中之一 较新版本的 Ruby 2 0 在这两个类之间并没有真正的显着差异 由于历史原因 某些库会使用其中之一 但不一定需要关注新代码 选择一个以保持一致性
  • as3函数指针

    private function myFunction numIn Number trace numIn numIn var plan Object theFunctionName myFunction now use the functi
  • 如何更改小程序的权限和卡历史字节?

    我已经认为更改历史字节仅限于预个性化步 但是 我发现了一个名为设置ATRHistBytes今天在 GlobalPlatform API 中 这是它的描述 GlobalPlatform 2 2 第 172 页 设置ATRHistBytes p
  • 更改游戏对象枢轴点

    Unity 对象未在中心旋转 直到一个小时才好 我不相信我改变了代码或任何东西 我也尝试过弄乱左上角的枢轴 中心按钮 但没有任何帮助 游戏对象没有在中间旋转 旋转器代码 using UnityEngine public class Rota
  • #ifndef 在 c 文件中?

    是否可以放 ifndef在c文件的顶部 基本上我需要检查运行程序时是否声明了某个预处理器常量 我的程序将相应地改变 我需要检查是否 D DESCENDING ORDER 1作为参数添加 无论给出什么值 我的主 c 文件顶部有以下代码 ifn
  • 无型号类别的改装 2

    我想问一下Retrofit 2 0 一直以来 我只知道使用 GSON Converter 进行 Retrofit 并获取对象 但我不知道如何使用这样的API获取数据https hacker news firebaseio com v0 to
  • 为什么 Ruby 仅有时释放内存?

    根据我生成字符串的方式 Ruby 是否会将内存释放给操作系统 第一个测试代码将占用约235MB size 2 22 string a1234567890abcdefghijklmnopqrstuvwxyz size puts Sleepin
  • 错误:已经有一个与此命令关联的打开的 DataReader,必须先将其关闭

    我正在使用 sql 连接来访问数据库中的不同表 但是 代码返回以下错误 Error 已经有一个与此命令关联的打开的 DataReader 必须先将其关闭 MyContext conn new MyContext protected void
  • 如何列出J中动词的代码

    在控制台中 输入不带参数的单个动词将打印其内容 tolower 3 0 x I 26 gt n 65 i 26 a i t y y x n 97 i 26 a x t 这对于开发来说很好 但在执行过程中无法利用 有没有办法动态地做到这一点
  • 为什么 Haskell 没有比 Eq 更强大的替代方案?

    之所以Set不是给定函子here 似乎可以归结为这样一个事实 a b f a f b是可能的 那么 为什么 Haskell 没有 Eq 的标准替代品 比如 class Eq a gt StrongEq a where a gt a gt B