【发布时间】:2019-10-10 13:22:26
【问题描述】:
我有以下代码:
parseExpr :: [String] -> (Ast,[String])
parseExpr [] = error "Incorrect"
parseExpr (s:ss) | all isDigit s = (Tall (read s),ss)
| s == "-" = let (e,ss') = parseExpr ss in (Min e,ss')
| s == "+" = (Sum e e',ss'') where
(e,ss') = parseExpr ss
(e',ss'') = parseExpr ss'
| s == "*" = (Mult e e',ss'') where
(e,ss') = parseExpr ss
(e',ss'') = parseExpr ss'
当我尝试运行它时,我收到一条错误消息“输入'|'时解析错误。它正在谈论的行是这一行:
...
(e',ss'') = parseExpr ss'
-> | s == "*" = (Mult e e',ss'') where
(e,ss') = parseExpr ss
...
我想我明白为什么了。我想这是因为我上面有两行没有被守卫屏蔽,当下面突然出现另一个守卫时,haskell 会感到困惑。但是在这些情况之后,我怎样才能添加额外的警卫呢?
我尝试过使用分号来分隔新行,但我对 Haskell 很陌生,因此不太了解它的语法。
【问题讨论】:
-
对所有警卫使用一个位置
-
我认为托马斯是对的。解析错误可能是因为在解析了第一个
where之后,代码会认为你的函数结束了。 -
即使忽略解析错误,在这种情况下使用单个
where也会减少大量重复代码。
标签: haskell syntax pattern-guards