Haskell中do块内为何必须使用let绑定?
为什么Haskell的do块里定义变量需要加let?
我尝试运行以下Haskell代码,想要输出转换为大写的字符串:
import Data.Char main = do output = map toUpper "helloworld" putStrLn output
运行后出现如下错误:
test.hs:4:12: error: parse error on input ‘=’ Suggested fix: Perhaps you need a 'let' in a 'do' block? e.g. 'let x = 5' instead of 'x = 5' | 4 | output = map toUpper "helloworld" |
但添加let绑定后代码就能正常运行:
main = do -- it works let output = map toUpper "helloworld" putStrLn output
原因说明
这是Haskell do块的语法规则决定的:
do块的核心作用是按顺序组织IO操作(比如putStrLn这种带有副作用的执行动作)。- 如果你要在
do块里定义纯变量(像output这种只是存储计算结果的变量,不产生副作用),必须用let关键字来明确标记这是变量绑定。 - 在
do块之外的纯代码上下文里,你可以直接写x = ...定义变量,但do块是特殊的语法结构,编译器需要通过let来区分“变量声明”和“要执行的IO动作”,否则会因为语法解析失败报错。
内容的提问来源于stack exchange,提问作者helloword
相关产品推荐
相关产品推荐

