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) = …
在我离开的地方实施 …
部分作为练习。
我需要帮助来使用模式匹配修复这个 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) = …
在我离开的地方实施 …
部分作为练习。