gpt4 book ai didi

haskell - 由于我使用了守卫,我的代码导致解析错误

转载 作者:行者123 更新时间:2023-12-02 21:05:34 24 4
gpt4 key购买 nike

我有以下代码:

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 就会感到困惑。但是在这些情况之后我怎样才能添加额外的 guard 呢?

我尝试过使用分号来分隔新行,但我对 Haskell 还很陌生,因此不太了解它的语法。

最佳答案

没有必要使用大括号(当然你可以)。但您确实需要小心缩进。这并不像乍看起来那么难。

话虽如此,确实不能在 protected 表达式中使用 where 。在这种情况下,你必须使用 let,如下所示:

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 == "+" = let (e,ss') = parseExpr ss
(e',ss'') = parseExpr ss'
in (Sum e e',ss'')
| s == "*" = let (e,ss') = parseExpr ss
(e',ss'') = parseExpr ss'
in (Mult e e',ss'')

但是,在您的例子中,保护表达式非常简单,可以用模式匹配替换。 (建议利用这个机会。模式匹配是你在 Haskell 中最好的 friend 。) 在这种情况下,你可以使用 where

parseExpr :: [String] -> (Ast,[String])
parseExpr [] = error "Incorrect"
parseExpr (s:ss) | all isDigit s = (Tall (read s),ss)
parseExpr ("-":ss) = (Min e,ss') where (e,ss') = parseExpr ss
parseExpr ("+":ss) = (Sum e e',ss'') where (e, ss' ) = parseExpr ss
(e',ss'') = parseExpr ss'

parseExpr ("*":ss) = (Mult e e',ss'') where (e, ss' ) = parseExpr ss
(e',ss'') = parseExpr ss'

关于haskell - 由于我使用了守卫,我的代码导致解析错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58323984/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com