Haskell中do与let..in语句的缩进问题求助
修复你的Haskell代码缩进与语法问题
我来帮你搞定这个问题——你遇到的是Haskell do块的语法规则问题,还有foldl的参数遗漏,咱们一步步来修正:
问题根源拆解
你的代码有两个核心问题:
foldl (+)缺少初始累加值:foldl的类型要求必须提供一个初始值来启动累加过程,直接传列表会导致后续类型和语法双重错误do块内语句未正确分隔,且let...in的用法不符合do块规范:do块里的let绑定不需要in,同时多个IO动作必须明确分隔
修复后的代码(惯用缩进风格)
这是符合Haskell编码习惯的修正版本:
fold' list = do let result = foldl (+) 0 list -- 补上累加初始值0,移除多余的in putStrLn $ "Reduced " ++ show result -- 每个IO动作单独一行并缩进 return result -- 作为独立动作换行缩进
如果需要写在单行,记得用分号分隔每个do块动作:
fold' list = do let result = foldl (+) 0 list; putStrLn $ "Reduced " ++ show result; return result
修复逻辑说明
foldl参数修正:foldl (+)需要三个参数:累加函数、初始值、待折叠列表。这里用0作为数值累加的初始值,是整数/浮点数累加的常规选择。do块语法修正:do块中的let绑定不需要in关键字,绑定的变量会自动作用于后续所有do块语句- 每个IO操作(比如
putStrLn、return)必须通过换行缩进或分号来明确区分,否则编译器无法识别语句边界,就会抛出你遇到的parse error on input 'in'错误
内容的提问来源于stack exchange,提问作者Curious
相关产品推荐
相关产品推荐

