有没有更简单的方法来模式匹配这个函数?

1 haskell

构建一个函数,该函数采用 X 和 Y 的布尔值并返回命题的布尔值。它应该按如下方式工作

>eval False False ((X :->: Y) :&: (Not Y :|: X))
True
>eval False True  ((X :->: Y) :&: (Not Y :|: X))
False
>eval True  False ((X :->: Y) :&: (Not Y :|: X))
False
>eval True  True  ((X :->: Y) :&: (Not Y :|: X))
True
Run Code Online (Sandbox Code Playgroud)

我能想到解决的唯一方法是对每种可能性进行模式匹配(如下所示),但肯定有更好的方法来做到这一点?

eval a b (X :|: Y) = a || b
eval a b (X :&: Y) = a && b
eval a b (X :->: Y) = not a || b
eval False False (X :|: X) = ...
eval False False (X :|: Tr) = ....
eval False False (X :|: Fa) = False
eval False False (X :|: Not _) = ...
eval False False (X :|: _ :&: _) = ...
eval False False (X :|: _ :|: _) = ...
eval False False (X :|: _ :->: _) = ...
eval False True (X :|: X) = ...
Run Code Online (Sandbox Code Playgroud)

Dan*_*ner 7

是的,有更好的方法。

eval a b (e :->: e') = ...
eval a b (e :|: e') = ...
eval a b (e :&: e') = ...
eval a b (Not e) = ...
eval a b Tr = ...
eval a b Fa = ...
eval a b X = ...
eval a b Y = ...
Run Code Online (Sandbox Code Playgroud)

填写这些点,你就完成了。如果您觉得重复很eval a b烦人,您可以使用case

eval a b expr = case expr of
    e :->: e' -> ...
    e :|: e' -> ...
    -- etc.
Run Code Online (Sandbox Code Playgroud)