【问题标题】:haskell indentation issue with do and let ..in statementshaskell 缩进问题与 do 和 let ..in 语句
【发布时间】:2018-01-21 14:08:19
【问题描述】:

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

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

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

【问题讨论】:

  • let 绑定在do 块中不需要in

标签: haskell indentation


【解决方案1】:

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 将使用let x = "4" 定义的x,而最后一个x 将使用let x = "2" 定义的x

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-26
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多