【发布时间】:2017-07-03 04:16:36
【问题描述】:
在检查不同整数类型的大小(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。 -
类型不固定怎么办?
-
当您期望相反的行为时,任何行为都可能令人困惑。
标签: haskell types ghci monomorphism-restriction