考虑以下函数
add1 :: Num a => a -> a
add1 x = x + 1
以及以下应用
*Main> add1 2
3
*Main> add1 2.2
3.2
*Main> add1 (read "1")
2
add1 (read "1.5"::Float)
2.5
*Main> add1 (read "1.5")
*** Exception: Prelude.read: no parse
为什么最后一次调用add1
对于浮点数失败,而对于整数却有效?为什么在这种情况下我必须指定类型?
GHCi 给出了它的类型
> :t add1 (read "1.5")
add1 (read "1.5") :: (Read a, Num a) => a
所以,它仍然是多态的。然而,当在 GHCi 中评估时,它隐式地print
ed,所以 GHCi 必须选择一些具体类型a
。 GHCi 用途违约规则,并静态选择a = Integer
。请注意,此选择是静态完成的(大致在类型检查期间),并且仅取决于类型(例如String
),而不是实际值(例如"1.5"
). Integer
既是一个Read
and a Num
,因此所有静态检查都通过。
更详细地说,GHCi 尝试类型()
, Integer
, Double
-- 按照这个顺序,除非有default
声明另有说明。
然后,在运行时代码的行为如下
> add1 (read "1.5") :: Integer
*** Exception: Prelude.read: no parse
因为无法解析字符串。相比之下,这样就好了:
> add1 (read "1.5") :: Float
2.5
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)