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编译器选项的最常见选项
Prelude> maxBound @Int
9223372036854775807
{-#语言类型应用程序}
注意事项:
- 要在GHCI提示中禁用此选项,只需
- 这篇文章有点过于冗长,但它只强调了许多情况下,这个编译选项很方便
Prelude> :set -XTypeApplications
Prelude> maxBound @Int
9223372036854775807
Prelude> maxBound @Bool
True
:set -XTypeApplications
Prelude> maxBound @Int
9223372036854775807
Prelude> :unset -XTypeApplications