Parsing 如何在Haskell的“let”表达式中定义带有“type”的值?

Parsing 如何在Haskell的“let”表达式中定义带有“type”的值?,parsing,haskell,let,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 Prelud

我试图用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
这就行了

let x = 1::Int

在Haskell文件中,类型声明与定义分开提供,通常位于以下行之前:

c :: Int    -- Type declaration
c = 4       -- Definition
这适用于本地定义,也适用于全球定义;您只需确保缩进对齐即可。所以在这种情况下,我们有

let c :: Int
    c = 4
in c + c
在Haskell中,换行符和缩进可以替换为大括号和分号,有时大括号可以省略。在GHCi中,输入多行输入需要使用分号分隔的变量;也就是说,那就是

let c :: Int ; c = 4
缺少in是因为GHCi的行为有点像do块;有更多的信息

但是,从提示中看,似乎已启用:set+m,因此也可以使用多行选项:

Prelude> let c :: Int
Prelude|     c = 4
Prelude|
Prelude>
另外,如果您想在后面添加一个类型注释,那么让c=4;c::Int工作正常;对于您正在处理的文件来说,这不是最好的样式


还有一个重要的提示:您没有使用Prelude,而是使用GHC的交互式Haskell环境。默认情况下,在提供、等定义的所有Haskell程序中导入的模块。GHCi的默认提示包含当前导入的所有模块的列表,因此默认情况下它是Prelude>;但是,如果键入import Data.Function,则提示将变为Prelude Data.Function>

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

c :: Int    -- Type declaration
c = 4       -- Definition
这适用于本地定义,也适用于全球定义;您只需确保缩进对齐即可。所以在这种情况下,我们有

let c :: Int
    c = 4
in c + c
在Haskell中,换行符和缩进可以替换为大括号和分号,有时大括号可以省略。在GHCi中,输入多行输入需要使用分号分隔的变量;也就是说,那就是

let c :: Int ; c = 4
缺少in是因为GHCi的行为有点像do块;有更多的信息

但是,从提示中看,似乎已启用:set+m,因此也可以使用多行选项:

Prelude> let c :: Int
Prelude|     c = 4
Prelude|
Prelude>
另外,如果您想在后面添加一个类型注释,那么让c=4;c::Int工作正常;对于您正在处理的文件来说,这不是最好的样式


还有一个重要的提示:您没有使用Prelude,而是使用GHC的交互式Haskell环境。默认情况下,在提供、等定义的所有Haskell程序中导入的模块。GHCi的默认提示包含当前导入的所有模块的列表,因此默认情况下它是Prelude>;但是,如果键入import Data.Function,提示将变为Prelude Data.Function>

类型签名可以显示在let、where或顶级声明或表达式中自己的行上。类型签名不适用于绑定的左侧。如何更正它可能重复错误说明了如何使用ScopedTypeVariables,可能您打算使用ScopedTypeVariables。在ghci中使用:set-XScopedTypeVariables启用ScopedTypeVariables。也就是说,如果你想使用这种特殊的语法,我来这里是想有人想在let块中放一个类型声明。我只是去检查一下报告看你是否可以合法地这么做。。。你不能。但是,你可以在里面放一个固定声明。。。奇怪的,呃?类型的签名可以出现在let、where或顶级声明或表达式中自己的行上。类型签名不适用于绑定的左侧。如何更正它可能重复错误说明了如何使用ScopedTypeVariables,可能您打算使用ScopedTypeVariables。在ghci中使用:set-XScopedTypeVariables启用ScopedTypeVariables。也就是说,如果你想使用这种特殊的语法,我来这里是想有人想在let块中放一个类型声明。我只是去检查一下报告看你是否可以合法地这么做。。。你不能。但是,你可以在里面放一个固定声明。。。奇怪吧?