2016-02-29 68 views
0

我试图定义一个像“Int”这样的特定类型的值,但似乎Prelude不支持它?如何在Haskell的“let”表达式中使用“type”定义值?

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

类型签名可以出现在自己的行上(在let,where或top level声明中)或表达式中。类型签名不适用于绑定的左侧。 –

+0

[GHCi中的多行命令]可能重复(http://stackoverflow.com/questions/8443035/multi-line-commands-in-ghci) –

+2

“如何更正它?” - 错误说明 - “也许你打算使用ScopedTypeVariables”。用':set -XScopedTypeVariables'在ghci中启用ScopedTypeVariables。也就是说,如果你想使用这个特定的语法。 – user2407038

回答

5

这将做到这一点

let x = 1::Int 
4

在一个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工作正常,它只是没有一个文件的最好的风格你“R E使用上)


此外,一个重要的注意事项:不使用“前奏”,你正在使用GHCi,GHC的交互式哈斯克尔环境。 Prelude是在所有Haskell程序中默认导入的模块(它提供了Bool,Eq,(.)等等的定义)。 GHCi的默认提示包含当前导入的所有模块列表,因此默认为Prelude>;但是,如果键入import Data.Function,则提示将更改为Prelude Data.Function>