Haskell 多重上下文 - 柯里化?

2024-03-26

在类型签名上编写上下文时,通常我会做类似的事情

f :: (Enum a, Ord a) => a -> a

但纯粹是运气不好,我发现它的编译结果似乎是相同的,至少在 GHC 7.8 上是这样:

f :: Enum a => Ord a => a -> a

两者之间的理论或实践差异是什么?第二个不那么正统吗?这哈斯克尔报告 https://www.haskell.org/onlinereport/haskell2010/haskellch4.html#x10-620004似乎没有提到第二种形式,而且我从未见过它在任何地方使用过。相关问题 https://stackoverflow.com/questions/11093847/haskell-type-signature-with-multiple-class-constraints.


两个版本是一样的。约束条件和forall-s 当它们尚不存在时浮到范围的顶部。例如,以下定义是有效的:

foo :: a -> a -> Num a => a
foo = (+)

bar :: a -> forall b. b -> a
bar = const

But :t foo prints Num a => a -> a -> a and :t bar prints a -> b -> a(这相当于forall a b. a -> b -> a).

GHC 不支持多态返回类型,这就是约束和量词被浮动的原因。我想这也可能是 GHC 抛出错误的有效设计选择。

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

Haskell 多重上下文 - 柯里化? 的相关文章

  • 有什么好的 JavaScript 货币或小数类吗?

    我正在尝试处理 JavaScript 值 例如23 45 但我希望能够对这些值进行数学运算 加法 减法 乘法 除法 而不会遇到浮点问题 是的 有时我可能需要对结果进行四舍五入 但我希望它给出合理的答案 在 JavaScript 中考虑一下
  • Hive - 通过聚合跨组的值来创建映射列类型

    我有一个看起来像这样的表 customer category room date 1 A aa d1 1 A bb d2 1 B cc d3 1 C aa d1 1 C bb d2 2 A aa d3 2 A bb d4 2 C bb d4
  • 选择 Haskell 解析器

    有很多开源的解析器实现 http hackage haskell org packages archive pkg list html cat parsing我们可以在 Haskell 中使用 Parsec http hackage has
  • 使用 stack 安装 shuffle 库时出错

    Using stack 1 2 0 and LTS 7 0我在安装时遇到以下错误shuffle https hackage haskell org package shuffle 图书馆 cabal get shuffle cd shuff
  • 使用类型类将 Haskell 中的值与类型关联起来

    我想使用类型类返回String功能上依赖于 Haskell 类型的实例 例如 假设我们有这样的类型Form 我想将字符串 form 与此类型相关联 给定类型Invocation 我想关联字符串 job 等等 重要的是我通常不会有相关类型的实
  • 是否可以使函数接受给定参数的多种数据类型?

    编写函数时 我必须声明输入和输出数据类型 如下所示 int my function int argument 是否可以声明我的函数接受 int bool 或 char 类型的变量 并且可以输出这些数据类型 non working examp
  • Haskell-Stack:构建期间出现访问冲突错误

    过去几天我一直在尝试使用堆栈构建我的 Haskell 项目 但遇到了访问冲突错误 据我了解 我有最新的堆栈版本和 GHC 这一切最初都是有效的 直到我将一个库添加到我的 cabal 文件中 我现在已经将其删除 但错误仍然出现 我也恢复到我的
  • 将单词的第一个字母大写,同时删除空格(Haskell)

    我刚刚开始使用 Haskell 这就像我正在写的第三件事 所以 自然地 我发现自己有点困惑 我正在尝试编写一些代码 该代码将获取一个字符串 删除空格 并将该字符串的每个字母大写 例如 如果我输入 这是一个测试 我想返回类似 thisIsAT
  • 什么时候适合使用关联类型而不是泛型类型?

    In 这个问题 https stackoverflow com q 32053402 155423 出现了一个问题 可以通过将使用泛型类型参数的尝试更改为关联类型来解决 这引发了一个问题 为什么关联类型在这里更合适 这让我想了解更多 The
  • 为什么Data.Hashmap中没有mapKeys?

    我想使用诸如mapKeys to map仅限按键 即有一个功能mapKeys in Data Map 但没有类似物Data Hashmap 此外 在Data Hashmap我没有发现任何有关操作按键的信息 是否只有不完整之处Data Has
  • 使自定义 monad 转换器成为 MonadError 的实例

    我想让我的 monad 转换器成为一个实例MonadError如果转换后的单子是一个实例 基本上我希望我的变压器的行为与内置变压器一样 例如有一个MonadError实例为StateT MonadError e m gt MonadErro
  • 精度和规模有什么区别?

    Oracle中精度和小数位数有什么区别 在教程中 他们通常在创建主键时将比例保留为空并将精度设置为 6 精度和规模代表什么 精度 4 尺度 2 99 99 精度 10 小数位数 0 9999999999 精度 8 标度 3 99999 99
  • 尝试以特殊行为渲染 Threepenny-gui 中的字段

    我想要做的是设置字段 当它们处于焦点时显示详细信息 而当它们不处于焦点时显示摘要 例如 A 当它失去焦点 变得模糊 时 我将值保存在 状态 映射中 然后将该值更改为旧值的函数 即汇总值 b 当它获得焦点时 我用我在地图中保存的旧值替换摘要值
  • 用户状态(秒差距)

    我正在使用秒差距解析一个表达式 并且我想使用秒差距中的用户状态来跟踪这些表达式中的变量 不幸的是我真的不知道该怎么做 给出以下代码 import Data Set as Set inp x y z data Var V String var
  • 应该如何理解“引理”函数的一般类型?

    也许这是一个愚蠢的问题 这是引用自the 哈索主义 paper https personal cis strath ac uk conor mcbride pub hasochism pdf 解决这个问题的一种方法是对引理进行编码 由下式给
  • 功能段落

    抱歉 我还不太明白 FP 我想将一系列行分割成一系列行序列 假设一个空行作为段落划分 我可以在 python 中这样做 如下所示 def get paraghraps lines paragraphs paragraph for line
  • 主函数抱怨返回非 IO monad

    import Debug Trace main do trace Main function parses and returns 0 return 这会引发错误 app hs 3 1 Couldn t match expected typ
  • 何时使用 STRef 或 IORef?

    STRef 和 IORef 之间到底有什么区别 何时使用它们 据我所知 它们都是可变状态 那么它们存在的意义是什么 您可以在其中做更多事情IO单子比ST单子 后者提供可变引用 前者提供可变引用 异常捕获 线程 当然还有IO 使用可以解决问题
  • 如何确定类型参数的方差?

    灵感来自Scala 中协变和逆变的现实示例 https stackoverflow com questions 5277526 real world examples of co and contravariance in scala我认为
  • 哪个 Haskell 计算机图形几何库?

    我想用 Haskell 做一些计算机图形学实验 这将包括进行一些几何计算并最终编写光线追踪器 我应该选择哪个库来轻松处理向量 矩阵及其相关操作 Hackage 上很少有包括像这样好看的vect http hackage haskell or

随机推荐