如何在 Haskell 的 "let" 表达式中使用 "type" 定义值?

How do I define a value with "type" in Haskell's "let" expression?

我试图定义一个具有特定类型的值,例如 "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 x = 1::Int

在 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's interactive Haskell environment. Prelude is the module that is imported by default in all Haskell programs (it provides the definitions of Bool, Eq, (.),等等)。 GHCi 的默认提示包含当前导入的所有模块的列表,因此默认为 Prelude>;但是,如果您键入 import Data.Function,提示将更改为 Prelude Data.Function>