eps*_*lbe 5 haskell types ghci monomorphism-restriction
在检查不同整数类型的大小(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]
^
Run Code Online (Sandbox Code Playgroud)
在我想到的最后一个地方19.
我的第一个猜测是maxBound默认为()并因此产生2,但我不明白,因为ma应该是Int通过显式类型注释(:: [Int]) - 并且通过引用透明度,所有命名的符号ma应该相等.
如果我将上面的语句放在一个文件中并加载到GHCi中,我会得到正确的结果.
那么为什么我会得到错误的结果呢?
Ale*_*lec 13
令人困惑的是,这仍然是单一性质限制(或者更确切地说,在GHCi中缺乏).由于GHCi没有启用单态限制,因此您的定义mi并ma不会Int像您认为的那样专门化- 而是保持一般性,mi, ma :: Bounded a => a并且a变量实例化两次
()中fromIntegral $ length $ show ma(如你观察到的,这是一个默认)Int中[mi,ma,le] :: [Int]如果您想要mi并且ma实际上是类型Int,请直接注释它们
Prelude> :{
Prelude| let mi, ma :: Int
Prelude| mi = minBound
Prelude| ma = maxBound
Prelude| le = fromIntegral $ length $ show ma
Prelude| in [mi,ma,le]
Prelude| :}
[-9223372036854775808,9223372036854775807,19]
Run Code Online (Sandbox Code Playgroud)
或者在GHCi中手动打开单态性限制
Prelude> :set -XMonomorphismRestriction
Prelude> :{
Prelude| let mi = minBound
Prelude| ma = maxBound
Prelude| le = fromIntegral $ length $ show ma
Prelude| in [mi,ma,le] :: [Int]
Prelude| :}
[-9223372036854775808,9223372036854775807,19]
Run Code Online (Sandbox Code Playgroud)