在类型签名上编写上下文时,通常我会做类似的事情
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(使用前将#替换为@)