ghci - 违约混乱

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没有启用单态限制,因此您的定义mima不会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)

  • @epsilonhalbe这是我在SO上回答的唯一问题之一,其中某人实际上想要拥有`MonomorphismRestriction`(而不是相反).:) (3认同)