数字文字具有多态类型:
*Main> :t 3
3 :: (Num t) => t
但是如果我将变量绑定到这样的文字,多态性就会丢失:
x = 3
...
*Main> :t x
x :: Integer
另一方面,如果我定义一个函数,它当然是多态的:
f x = 3
...
*Main> :t f
f :: (Num t1) => t -> t1
我可以提供类型签名以确保x
保持多态性:
x :: Num a => a
x = 3
...
*Main> :t x
x :: (Num a) => a
但为什么这是必要的呢?为什么不推断多态类型?
这是单态限制这表示所有不带参数定义且没有显式类型注释的值都应该具有单态类型。可以使用以下命令在 ghc 和 ghci 中禁用此限制-XNoMonomorphismRestriction
.
限制的原因是没有这个限制long_calculation 42
会被评估两次,而大多数人可能期望/希望它只被评估一次:
longCalculation :: Num a => a -> a
longCalculation = ...
x = longCalculation 42
main = print $ x + x
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)