Haskell 模式匹配布尔值

Haskell Pattern Matching Booleans

我需要帮助来使用模式匹配修复这个 Haskell 函数。只有当公式列表中的每个公式都为真时,它才应该 return 为真。这是我目前所拥有的:

eval_list :: [Formula] -> Bool
eval_list (f:fx) = (eval_list f) && (eval_list fx)

公式的定义如下:

data Formula = And Formula Formula
             | Not Formula
             | Con Bool
             deriving Show

您忘记为空列表实现案例。由于您每次都使用比上一次调用短一项的列表项进行递归,因此最终您将使用空列表进行递归调用。

另一个问题是您调用 eval_list f,但 f 是您列表的第一项,因此是一个 Formula 对象,而不是 Formula 的列表.您可能应该使用 eval_formula 来计算公式。

因此您可以通过以下方式实现:

eval_list :: [Formula] -> Bool
eval_list <strong>[]</strong> = True
eval_list (f:fx) = <strong><i>eval_formula</i> f</strong> && eval_list fx

您必须在其中 eval_formula 自己实施。

您不需要使用显式递归。例如,您可以使用 all :: Foldable f => (a -> Bool) -> f a -> Bool:

eval_list :: Foldable f => f Formula -> Bool
eval_list = <strong>all</strong> <i>eval_formula</i>

为了计算单个 Formula,您可以使用递归,函数将如下所示:

eval_formula :: Formula -> Bool
eval_formula (And f1 f2) = …
eval_formula (Not f) = …
eval_formula (Con b) = …

在我离开的地方实施 部分作为练习。