解析案例表达式时出错

时间:2017-03-15 04:58:04

标签: haskell

我收到了这个编译错误:

Files.hs:47:17: parse error on input ‘->’
Failed, modules loaded: none.

在以下代码部分中:

main :: IO ()
main = do
    args <- getArgs
    let f = case args of
        ("W":_) -> eoltoW
        --      ^  here's 47:17
        ("U":_) -> eoltoU
        _       -> fail "2 - 3 arguments required"
    case args of
        [_,i,o] -> editWith f i o
        [_,i]   -> catWith  f i
        [_]     -> fail "2 - 3 arguments required"

虽然我理解逻辑可以使用一些整理,但我不知道我的案例语法出错了。我认为这可能是与dolet的一些奇怪的互动,但我找不到任何关于如何纠正它的线索。

注意,我确保我只使用空格进行缩进

编辑:

似乎进一步添加单个空格的缩进(如下所示)足以防止错误,但我不明白为什么。

main = do
    args <- getArgs
    let f = case args of
         ("W":_) -> eoltoW
         --      ^  here's 47:17
         ("U":_) -> eoltoU
         _       -> fail "2 - 3 arguments required"

1 个答案:

答案 0 :(得分:3)

2.710.3中对此进行了描述。基本上,let …块*中do的规则是所有绑定都必须以相同的方式缩进:

let a = …
    b = …
    c = …

此外,“...”必须更多缩进,而不是布局列表。例如,以下是语法错误:

let a =
    10
in a

为了创建一个新的布局列表,我们需要进一步缩进(参见第10.3节中的注释1),这就是为什么

let a =
     10
in a

完全没问题。您的case也是如此。由于偏离规则,所有案例都必须进一步缩进f

*该规则实际上持有**更多,即letwheredoof
**好吧,只要你不引入额外的括号

相关问题