我尝试了各种组合来修复以下代码的缩进但是失败了。我该如何解决以下问题
fold' list = do
let result = foldl (+) list
in putStrLn $ "Reduced " ++ show(result)
return $ result
parse error on input `in'
Failed, modules loaded: none.
答案 0 :(得分:4)
在 do
子句中,不应使用 in
关键字。
所以你可以用写作来解决它:
fold' list = do
let result = foldl (+) list
putStrLn $ "Reduced " ++ show(result) -- no "in" keyword
return $ result
let
语句的范围是其余条款。
翻译类似于section 3.14 of the Haskell report [link]:
中指定的do {e} = e do {e;stmts} = e >> do {stmts} do {p <- e; stmts} = let ok p = do {stmts} ok _ = fail "..." in e >>= ok do {let decls; stmts} = let decls in do {stmts}
因此,如果我们定义两个具有相同名称的let
语句(推荐不),则第一个移到顶部的语句将计算在内。
所以:
foo = do
let x = "4"
putStrLn x
let x = "2"
putStrLn x
它将转化为:
foo = let x = "4" in (putStrLn x >> (let x = "2" in putStrLn x))
因此,第一个putStrLn
将使用x
定义的let x = "4"
,而最后一个将使用x
中定义的let x = "2"
。