我正在学习Haskell,当我遇到一些非常令人费解的事情时,我正在玩ghci.
首先,创建一个简单的添加功能:
Prelude> let add x y = x + y
请注意,它适用于整数和浮点数:
Prelude> add 3 4
7
Prelude> add 2.5 1.3
3.8
现在创建一个apply函数.它与$(但不是中缀)相同.它的工作方式类似于无操作:
Prelude> let apply f x = f x
Prelude> apply add 3 4
7
Prelude> apply add 2.5 1.3
3.8
好的,现在制作add'哪个与add'使用相同apply:
Prelude> let add' = apply add
Prelude> add' 3 4
7
Prelude> add' 2.5 1.3
<interactive>:1:9:
    No instance for (Fractional Integer)
      arising from the literal `1.3' at <interactive>:1:9-11
    Possible fix: add an instance declaration for (Fractional Integer)
    In the second argument of `add'', namely `1.3'
    In the expression: add' 2.5 1.3
    In the definition of `it': it = add' 2.5 1.3
笏.
以下是类型:
Prelude> :t add
add :: (Num a) => a -> a -> a
Prelude> :t apply add
apply add :: (Num t) => t -> t -> t
Prelude> :t add'
add' :: Integer -> Integer -> Integer
Prelude> 
为什么add'有不同的类型apply add?
这是一个奇怪的,或者在Haskell中是否真的如此?(我怎么能分辨出来呢?)
Dan*_*her 18
这是Monomorphism限制.当您使用简单的模式绑定(只是名称,没有任何函数参数)定义值并且没有类型签名时,它将获得单态类型.根据默认规则尝试消除任何类型变量的歧义,如果不成功则会出现类型错误.
在这种情况下,Num约束类型变量默认为Integer.
您可以使用关闭单同性限制
ghci> :set -XNoMonomorphismRestriction
或者-XnoMonomorphismRestriction在命令行上使用标志.