为什么Int maxBound不起作用?

时间:2011-04-24 02:37:37

标签: haskell constructor int

当我尝试

> Int maxBound

在ghci中,我得到了

Not in scope: data constructor 'Int'

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

3 个答案:

答案 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类型的函数,其中aBounded。但是,它不接受任何参数。 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编译器选项的最常用选项。

  1. 在GHCI会话中启用TypeApplications
Prelude> :set -XTypeApplications
Prelude> maxBound @Int
9223372036854775807
Prelude> maxBound @Bool
True
    通过在文件 .ghci 中添加以下内容,
  1. 在目录级别或OS用户级别启用TypeApplications。
:set -XTypeApplications

然后在GHCI提示符下

Prelude> maxBound @Int
9223372036854775807
  1. 通过在文件的开头放置以下内容,在Haskell文件级别启用TypeApplications。
{-# LANGUAGE TypeApplications #-}

注释:

  • 仅在GHCI提示中禁用此选项
Prelude> :unset -XTypeApplications
  • 这篇文章有点太冗长,但只强调了这种编译选项派上用场的许多情况。