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

时间:2016-02-29 00:42:11

标签: parsing haskell let

我试图定义一个特定类型的值,如“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]

如何纠正?

2 个答案:

答案 0 :(得分:5)

这样做

let x = 1::Int

答案 1 :(得分:4)

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

public ActionResult Upload([Bind(Prefix="FormUpload")]UploadViewModel model)

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

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

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

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

(缺少let c :: Int ; c = 4 是因为GHCi的行为有点像in块; this Stack Overflow question有更多信息。)

但是,它会从您的提示中看起来就像您已启用do一样,因此您也可以使用多行选项:

:set +m

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

另外,一个重要的注意事项:您没有使用&#34; Prelude&#34;,您正在使用GHCi GHC的交互式Haskell环境。 Prelude是默认情况下在所有Haskell程序中导入的模块(它提供BoolEq(.)等的定义。 GHCi的默认提示包含当前导入的所有模块的列表,因此默认情况下它是let c = 4 ; c :: Int;但是,如果您输入Prelude>,则提示将更改为import Data.Function