如何在 Haskell 的“let”表达式中用“type”定义一个值?

Posted

技术标签:

【中文标题】如何在 Haskell 的“let”表达式中用“type”定义一个值?【英文标题】:How do I define a value with "type" in Haskell's "let" expression? 【发布时间】:2016-06-11 22:35:20 【问题描述】:

我试图定义一个特定类型的值,如“Int”,但 Prelude 似乎不支持它?

Prelude> let c::Int = 4
Prelude| 

<interactive>:49:8:
    Illegal type signature: ‘Int’
      Perhaps you intended to use ScopedTypeVariables
    In a pattern type-signature
Prelude> let [Int]c=4
Prelude| 

<interactive>:51:5: Parse error in pattern: [Int]

如何纠正?

【问题讨论】:

类型签名可以出现在自己的行(在 let、where 或***声明中)或表达式中。类型签名不适用于绑定的左侧。 Multi-line commands in GHCi的可能重复 "如何修正?" - 错误说明如何 - “也许您打算使用 ScopedTypeVariables”。使用 :set -XScopedTypeVariables 在 ghci 中启用 ScopedTypeVariables。也就是说,如果你想使用这种特定的语法。 我来到这里是想有人想在 let 块中放置 type 声明。我只是去检查报告,看看你是否可以合法地这样做......你不能。 (但是,您可以在其中放置一个固定性声明......很奇怪,是吗?) 【参考方案1】:

在 Haskell 文件中,类型声明与定义分开提供,通常在前一行:

c :: Int    -- Type declaration
c = 4       -- Definition

这适用于本地定义以及全局定义;你只需要确保缩进对齐。所以在这种情况下,我们有

let c :: Int
    c = 4
in c + c

在 Haskell 中,换行和缩进可以用大括号和分号代替,有时大括号可以省略。在 GHCi 中,输入多行输入需要some extra machinery,您通常需要分号分隔的变体;也就是说,那将是

let c :: Int ; c = 4

(缺少in 是因为GHCi 的行为有点像do 块;this Stack Overflow question 有更多信息。)

但是,从您的提示看来,您好像打开了 :set +m,因此您也可以使用多行选项:

Prelude> let c :: Int
Prelude|     c = 4
Prelude|
Prelude>

(另外,如果您想在之后添加类型注释,let c = 4 ; c :: Int 可以正常工作;这不是您正在处理的文件的最佳样式。)


另外,重要的一点:您使用的不是“Prelude”,而是GHCi,GHC 的交互式 Haskell 环境。 Prelude 是所有 Haskell 程序中默认导入的模块(它提供了 BoolEq(.) 等的定义)。 GHCi的默认提示包含当前导入的所有模块的列表,所以默认是Prelude&gt;;但是,如果您输入import Data.Function,提示符将变为Prelude Data.Function&gt;

【讨论】:

【参考方案2】:

这样就可以了

let x = 1::Int

【讨论】:

以上是关于如何在 Haskell 的“let”表达式中用“type”定义一个值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Haskell 中嵌套 let 语句?

Haskell:具有多个***绑定的“where”子句?

理解 LISP 中的“let”表达式

不使用 in 时 let 的范围是啥?

Idris——类似Haskell的纯函数编程语言

在haskell中用aeson解析部分json对象