在检查不同整型的大小(minBound
,maxBound
)和“十进制表示下的长度”时,我偶然看到了一些奇怪的行为。
使用GHCi:
Prelude> :{
Prelude| let mi = minBound
Prelude| ma = maxBound
Prelude| le = fromIntegral $ length $ show ma
Prelude| in [mi,ma,le] :: [Int]
Prelude| :}
[-9223372036854775808,922372036854775807,2]
^
在我最不期望的地方,我得到了
19
。我的第一个猜测是
maxBound
默认为()
,因此产生了2
,但我不理解这一点,因为ma
应该是一个Int
,通过显式类型注释(:: [Int]
)- 通过引用透明度,所有名为ma
的符号应该相等。如果我把上面的语句放在一个文件中并加载到GHCi中,我会得到正确的结果。
那么我为什么会得到错误的结果?
ma
的类型直到后面才被固定为Int
,所以le
使用的是ma :: Bounded a => a
,它在显示中默认为()
. 如果你再用ma = maxBound :: Int
试一次,应该会得到19。 - jkeuhlen