当我尝试
时> Int maxBound
在ghci中,我得到了
Not in scope: data constructor 'Int'
即使我import Data.Int
,问题仍然存在。这是怎么回事?
答案 0 :(得分:10)
编辑:该函数的官方文档位于http://www.haskell.org/ghc/docs/7.0.3/html/libraries/base-4.3.1.0/Prelude.html#v:maxBound
首先,你应该做
Prelude> maxBound :: Int
9223372036854775807
Prelude>
如果查看maxBound
的类型签名:
Prelude> :t maxBound
maxBound :: (Bounded a) => a
然后maxBound
是一个返回a
类型的函数,其中a
是Bounded
。但是,它不接受任何参数。 Int maxBound
表示您尝试使用数据构造函数Int
和参数maxBound
创建内容。
对于您的特定错误消息,您尝试使用Int
- 这是一种类型 - 作为值,从而导致您获得的错误。导入Data.Int
无济于事。
答案 1 :(得分:6)
这不是有效的Haskell。
maxBound
是一个常量,用于定义the Bounded
class中的最大类型元素:
Prelude> :t maxBound
maxBound :: Bounded a => a
要获取任何特定类型的边界,您需要将其专门化为特定类型。 Type annotations在表达式上由::
语法给出,如下所示:
Prelude> maxBound :: Int
9223372036854775807
答案 2 :(得分:0)
即使这种情况( maxBound )不是 TypeApplications GHC编译器选项的最常用的用法,我还是发现了更多与类型注释选项 :: 相比更具暗示性(至少对我来说是刚上Haskell船的人)。
我承认它需要编译选项/编译指示,但这是我在 〜/ .ghci 文件中全局激活的众多选项之一。而且很容易申请!
因此,事不宜迟,让我们在实践中看一下。对于我来说,以下是启用TypeApplications编译器选项的最常用选项。
Prelude> :set -XTypeApplications
Prelude> maxBound @Int
9223372036854775807
Prelude> maxBound @Bool
True
:set -XTypeApplications
然后在GHCI提示符下
Prelude> maxBound @Int
9223372036854775807
{-# LANGUAGE TypeApplications #-}
注释:
Prelude> :unset -XTypeApplications