gpt4 book ai didi

haskell - 应用式秒差距的问题

转载 作者:行者123 更新时间:2023-12-02 12:09:19 27 4
gpt4 key购买 nike

我有以下 ADT:

type Program = [Expr]
data Expr =
Num Int
| Bool Bool
| Binding String Expr
deriving (Show)

这是一个变量绑定(bind)表达式的解析器,其形式为lhs is rhs

binding :: Parser Expr
binding = do
lhs <- word
spaces
string "is"
spaces
rhs <- expr
return $ Binding lhs rhs

它工作正常,但是当我尝试将其转换为应用样式时,它给出了错误的结果。

binding :: Parser Expr
binding = Binding <$> word <* (spaces *> string "is" *> spaces) *> expr

将括号部分中的 *> 替换为 >> 也不起作用。这两种实现有什么区别?是否有一个组合器来组合两个解析器并忽略两者的结果?

尝试使用 Debug.trace 进行调试也不起作用...没有打印任何内容。

binding :: Parser Expr
binding = (\x y -> trace (show (x, y)) (Binding x y)) <$> word <* (spaces *> string "is" *> spaces) *> expr

解析器的其余部分,用于上下文:

word :: Parser String
word = many1 letter

expr :: Parser Expr
expr = binding <|> atom

program :: Parser Program
program = do
spaces
result <- many (expr <* spaces)
return result

最佳答案

你的问题是<$><*>等等是左结合的。这意味着您的行:

binding = Binding <$> word <* (spaces *> string "is" *> spaces) *> expr

将被解释为

binding = (Binding <$> word <* (spaces *> string "is" *> spaces)) *> expr

这意味着它将解析并忽略最后一个 expr 之前的所有内容。正如 @icktoofay 所说,您可以将预期版本编写为:

binding = Binding <$> word <* spaces <* string "is" <* spaces <*> expr

由于左结合性,根本不需要任何括号。

关于haskell - 应用式秒差距的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28666983/

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