只是为了好玩,我想看看如果我在 Haskell 中定义一个函数会发生什么Int -> Int
,因为知道它会溢出并且必须返回一个Integer
. 考虑以下:
factorial :: Int -> Int
factorial n = product [1..n]
现在我知道,如果我运行factorial 50
,我将在 的 'codomain' 之外获得一个数字factorial
。由于 Haskell 的类型非常强,我希望它会返回错误。相反,GHCi 返回一个奇怪的否定Int
:
ghci> factorial 50
-3258495067890909184
请注意
ghci> maxBound :: Int
9223372036854775808
因为我在 64 位上运行。
我觉得这种行为有点可怕:为什么 Haskell 不引发错误?为什么会factorial 50
返回一个随机负数?任何澄清将不胜感激。