haskell缩进问题与do和let ..in语句

时间:2018-01-21 14:08:19

标签: haskell indentation

我尝试了各种组合来修复以下代码的缩进但是失败了。我该如何解决以下问题

fold' list = do
    let result = foldl (+) list
    in putStrLn $ "Reduced " ++ show(result)
    return $ result

 parse error on input `in'
Failed, modules loaded: none.

1 个答案:

答案 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"