λ> succ 5
6
λ> :t succ 5
succ 5 :: (Enum a, Num a) => a
这是如何工作的?由于文字是多态的,被选中的实例是什么?我怀疑它是Integer
,但为什么呢?
我的第一个理论是succ
的默认实现可能会发挥作用(我不知道为什么会发生这种情况),但是,不,不是这样的情况,因为它不会正常工作:
λ> :t succ (10^20)
succ (10^20) :: (Enum a, Num a) => a
λ> succ (10^20)
100000000000000000001
λ>
λ> let test = toEnum . (+1) . fromEnum :: Enum a => a -> a
λ> :t test (10^20)
test (10^20) :: (Enum a, Num a) => a
λ> test (10^20)
7766279631452241921
所以,再次,我很确定它是Integer
的实例。但为什么呢?