Haskell 为什么Int maxBound不起作用?

Haskell 为什么Int maxBound不起作用?,haskell,constructor,int,Haskell,Constructor,Int,当我尝试 > Int maxBound 在ghci,我得到了 Not in scope: data constructor 'Int' 即使我导入Data.Int,问题仍然存在。这是怎么回事?编辑:该功能的官方文档位于 首先,你应该这样做 Prelude> maxBound :: Int 9223372036854775807 Prelude> 如果查看maxBound的类型签名: Prelude> :t maxBound maxBound :: (Bounded

当我尝试

> Int maxBound
在ghci,我得到了

Not in scope: data constructor 'Int'

即使我导入Data.Int,问题仍然存在。这是怎么回事?

编辑:该功能的官方文档位于

首先,你应该这样做

Prelude> maxBound :: Int
9223372036854775807
Prelude> 
如果查看
maxBound
的类型签名:

Prelude> :t maxBound
maxBound :: (Bounded a) => a
然后
maxBound
是一个返回
a
类型的函数,其中
a
Bounded
。但是,它不接受任何参数
Int-maxBound
表示您正在尝试使用数据构造函数
Int
和参数
maxBound
创建一些内容


对于特定的错误消息,您试图使用
Int
-这是一种类型-作为值,从而导致出现错误。导入
数据.Int
没有帮助。

这是无效的Haskell

是一个常量,用于定义以下类型的最大元素:

要获得任何特定类型的绑定,需要将其专门化为特定类型。表达式的语法如下所示:

Prelude> maxBound :: Int
9223372036854775807
即使这种情况(maxBound)不是TypeApplicationsGHC编译器选项最简洁的用法,但我发现它比类型注释选项::(至少对我这个刚登上Haskell船的人来说)更具启发性

我承认它需要一个编译选项/pragma,但它是我在~/.ghci文件中全局激活的许多选项之一。而且很容易应用

所以,不用再多说了,让我们在实践中看看。以下是启用TypeApplications编译器选项的最常见选项

  • 每个GHCI会话启用类型应用程序
  • 通过在文件.ghci中添加以下内容,在目录级或操作系统用户级启用TypeApplications
  • 然后在GHCI提示符中

    Prelude> maxBound @Int
    9223372036854775807
    
  • 在Haskell文件级别启用TypeApplications,方法是将以下内容放在文件开头
  • {-#语言类型应用程序}
    
    注意事项:

    • 要在GHCI提示中禁用此选项,只需
    • 这篇文章有点过于冗长,但它只强调了许多情况下,这个编译选项很方便

    撇开不谈,现在链接到zvon是一种不好的做法:它非常过时,有时会产生误导。最好链接到Prelude或base库的黑客文档;这是第一个谷歌链接。我会换的。
    Prelude> :set -XTypeApplications
    Prelude> maxBound @Int
    9223372036854775807
    Prelude> maxBound @Bool
    True
    
    :set -XTypeApplications
    
    Prelude> maxBound @Int
    9223372036854775807
    
    Prelude> :unset -XTypeApplications