我正在尝试编写一个如下工作的函数;
连词 [a, b, c] == And a (And bc)
我不确定执行此操作的最佳方法到底在哪里,我假设使用 x:xs 模式进行列表递归?
我正在尝试编写一个如下工作的函数;
连词 [a, b, c] == And a (And bc)
我不确定执行此操作的最佳方法到底在哪里,我假设使用 x:xs 模式进行列表递归?
这是一种选择。如果列表中没有元素,则按照True
惯例它们的连接。所以你有了
conjunction [] = True
如果有多个元素,则合取是True
if 该元素是True
,并且所有其他元素的合取是True
conjunction (x:xs) = x && conjunction xs
这种特殊模式(一次遍历一个列表,并与二进制函数结合)在函数编程中非常常见。事实上,它很常见,有一个辅助函数,称为foldr
. 所以你可以写
conjunction xs = foldr (&&) True xs
其中第一个参数指定组合函数,第二个参数指定列表为空时的值。
或者你可以只使用一个已经定义的函数,比如
conjunction = and
这是一些工作代码,基于 J. Abrahamson 的评论 -
data MyBool = MyTrue | MyFalse | And MyBool MyBool deriving (Show)
main = do
print $ foldr1 And [MyTrue, MyFalse, MyTrue, MyTrue, MyFalse, MyTrue]
(我假设你的大写“And”是一个构造函数而不是一个错字......)
这不包括 [] 的情况,您可以使用模式匹配将其拉出。