haskell - ghci - 默认混淆

标签 haskell types ghci monomorphism-restriction

在检查不同整数类型的大小( minBoundmaxBound )和“十进制表示的长度”时,我碰巧看到了一些奇怪的行为。

使用 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 中,我会得到正确的结果。

那么为什么我会得到错误的结果呢?

最佳答案

令人困惑的是,这仍然是单态限制在起作用(或者更确切地说,在 GHCi 中缺乏单态限制)。由于 GHCi 没有启用单态限制,您对 mi 的定义和 ma不要专攻Int正如您认为的那样 - 相反,它们保持一般性 mi, ma :: Bounded a => aa变量被实例化两次

  • 曾经为 ()fromIntegral $ length $ show ma (如您所见,这是默认设置)
  • 曾经为 Int[mi,ma,le] :: [Int]

  • 如果你想要 mima实际上是 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]
    

    或者在 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]
    

    关于haskell - ghci - 默认混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42233527/

    相关文章:

    json - 在 Haskell 中使用 JSON 序列化记录

    haskell - 从字典和维度生成所有可能组合的功能性尾递归方式

    haskell - 通过将 Monads 转换为 Semigroups 来重叠实例

    haskell - 为什么不在 Haskell 中进行类型检查?

    Haskell - 如何写 (.) f f = (\x -> f (f x))

    haskell - 在树莓派上编译 Haskell

    haskell - 如何安装 intellij-haskell 插件?

    typescript - 如何在 TypeScript 2 项目中安装 Firebase 3 的类型?

    Android RenderScript Matrix_2x2 元素数据类型

    haskell - 为什么 GHCi 在此错误消息中不显示多态类型?