【问题标题】:Haskell Multiple Contexts - currying?Haskell 多上下文 - 柯里化?
【发布时间】:2015-01-21 23:56:55
【问题描述】:

在类型签名上编写上下文时,通常我会这样做

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

但由于运气不佳,我发现它可以编译并且似乎工作相同,至少在 GHC 7.8 上:

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

两者在理论上或实践上有什么区别?第二个不那么正统吗? Haskell report 似乎没有提到第二种形式,而且我从未见过它在任何地方使用过。 Related question.

【问题讨论】:

标签: haskell types


【解决方案1】:

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

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

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

但是:t foo 打印Num a => a -> a -> a:t bar 打印a -> b -> a(相当于forall a b. a -> b -> a)。

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

【讨论】:

  • 虽然如果严格遵循 2010 语法,第一个应该是解析器错误。然后,另一方面,GHC's parser 充满了我无法理解的东西。
  • FTR,这里是解析器的相关部分:github.com/ghc/ghc/blob/…
猜你喜欢
  • 1970-01-01
  • 2019-01-28
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
相关资源
最近更新 更多