首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Haskell的"let“表达式中定义带有"type”的值?

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

Stack Overflow用户
提问于 2016-02-29 00:42:10
回答 2查看 1.3K关注 0票数 1

我试图用"Int“这样的特定类型来定义一个值,但似乎Prelude不支持它吗?

代码语言:javascript
复制
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]

怎么改正呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-29 00:54:50

这样就行了

代码语言:javascript
复制
let x = 1::Int
票数 5
EN

Stack Overflow用户

发布于 2016-02-29 01:33:34

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

代码语言:javascript
复制
c :: Int    -- Type declaration
c = 4       -- Definition

对于本地定义和全局定义,这是正确的;您只需要确保缩进对齐即可。所以在这种情况下,我们有

代码语言:javascript
复制
let c :: Int
    c = 4
in c + c

在Haskell中,换行符和缩进可以用大括号和分号代替,有时大括号可以省略。在GHCi中,输入多行输入需要一些额外的机器,通常需要分号分隔的变量;也就是说,这将是

代码语言:javascript
复制
let c :: Int ; c = 4

(缺少in是因为GHCi的行为有点像do块;这个堆栈溢出问题有更多的信息。)

但是,从提示符中可以看到您打开了:set +m,因此您也可以使用多行选项:

代码语言:javascript
复制
Prelude> let c :: Int
Prelude|     c = 4
Prelude|
Prelude>

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

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35690218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档