作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在类型签名上编写上下文时,通常我会做类似的事情
f :: (Enum a, Ord a) => a -> a
但是纯粹是运气不好,我发现它的编译结果似乎是相同的,至少在 GHC 7.8 上是这样:
f :: Enum a => Ord a => a -> a
两者之间的理论或实践差异是什么?第二个不那么正统吗? Haskell report似乎没有提到第二种形式,而且我从未见过它在任何地方使用过。 Related question .
最佳答案
两个版本是一样的。当约束和 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 不支持多态返回类型,这就是约束和量词被 float 的原因。我想这也可能是 GHC 抛出错误的有效设计选择。
关于Haskell 多重上下文 - 柯里化(Currying)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28069938/
我是一名优秀的程序员,十分优秀!