gpt4 book ai didi

haskell - 逻辑表达式计算器 Haskell

转载 作者:行者123 更新时间:2023-12-02 18:01:50 24 4
gpt4 key购买 nike

我编写了以下逻辑表达式计算器。它适用于简单的双成员表达式,并且它运行但会为包含其他表达式作为第二/第一个成员的表达式产生错误。这是我的代码。

data Expression = Literal Bool | Operation Operator Expression Expression
data Operator = AND | OR

eval :: Expression -> Bool
eval (Literal x) = x
eval (Operation AND (Literal x) (Literal y))
| x == True && y == True = True
| otherwise = False
eval (Operation OR (Literal x) (Literal y))
| x == False && y == False = False
| otherwise = True

使用此输入调用时它可以正常工作:

main = do
print $ eval (Operation OR (Literal False) (Literal False))

但是使用此输入调用时会产生错误:

main = do
print $ eval( Operation OR (Literal True) (Operation AND (Literal True) (Literal False)) )

最佳答案

你使eval有点太低级了。通过在签名中包含Literal。更好的方法是使用递归:

eval :: Expression -> Bool
eval (Literal x) = x
eval (Operation AND x y) = (eval x) && (eval y)
eval (Operation OR x y) = (eval x) || (eval y)

换句话说,在右侧调用eval。如果它是一个Literal,它将立即解析为正确的值,如果它是一个级联表达式,它也会解析该Operation _ _ _

一般情况下不建议启动级联模式匹配(好吧,有时还是有用的)。在这种情况下,您至少应该问问自己是否没有更优雅的解决方案。

这段代码很容易表明该函数是total(无论输入是什么,它总是会生成结果)。您的代码并非如此。始终尝试执行总体检查

编辑

如果 Operation 的数量显着增加,您最好将关注点分离到 handler::Operation -> Bool -> Bool -> Bool 函数和eval 函数。像这样的东西:

data Expression = Literal Bool | Operation Operator Expression Expression
data Operator = AND | OR | XOR

handler :: Operation -> Bool -> Bool -> Bool
handler AND = (&&)
handler OR = (||)
handler XOR = xor
where xor True False = True
xor False True = True
xor _ _ = False

eval :: Expression -> Bool
eval (Literal x) = x
eval (Operation o x y) = (handler o) (eval x) (eval y)
<小时/>

如果您需要处理NOT,这是另一种类型的表达式:

data Expression = Literal Bool | Operation Operator Expression Expression | OperationU OperatorU Expression

OperatorU 这里是一个一元运算符。例如:

data OperatorU = ID | NOT

ID表示身份。现在,在这种情况下,您可以定义第二个处理程序:

handlerU :: OperatorU -> Bool -> Bool
handlerU ID = id
handlerU NOT = not

然后eval读取:

eval :: Expression -> Bool
eval (Literal x) = x
eval (Operation o x y) = (handler o) (eval x) (eval y)
eval (OperationU o x) = (handlerU o) (eval x)

关于haskell - 逻辑表达式计算器 Haskell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30880087/

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