以下代码无法编译:
import Data.Bits
xor2 = xor
但是,一旦我添加了类型信息,它就会编译:
import Data.Bits
xor2 :: Bits a => a->a->a
xor2 = xor
我无法解释这一点。有什么解释吗?
最佳答案
这是 dreaded monomorphism restriction 的问题(MMR),默认启用。 MMR 是一条规则,强制看起来不像函数的顶级绑定(bind)(即 x = ...
与 x a = ...
)具有单态绑定(bind),除非它们具有显式的多态类型签名。
问题在于Bits a => a -> a -> a
是多态的(注意类型变量a
),Haskell不知道如何选择满足 Bits
约束的 a
的默认类型。
添加类型签名后,MMR 就会得到缓解,您就可以拥有多态的顶级绑定(bind)。另一种选择是通过添加命名参数来“eta 扩展”定义;由于 xor2 现在在语法上看起来像一个函数,因此 MMR 不适用:
xor2 x = xor x
您还可以使用语言扩展关闭 MMR。您可以将其放在模块的顶部:
{-# LANGUAGE NoMonomorphismRestriction #-}
关于function - Haskell 中的别名函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28245328/