1

我正在尝试编写一个如下工作的函数;

连词 [a, b, c] == And a (And bc)

我不确定执行此操作的最佳方法到底在哪里,我假设使用 x:xs 模式进行列表递归?

4

2 回答 2

3

这是一种选择。如果列表中没有元素,则按照True惯例它们的连接。所以你有了

conjunction []     = True

如果有多个元素,则合取是Trueif 该元素是True,并且所有其他元素的合取是True

conjunction (x:xs) = x && conjunction xs

这种特殊模式(一次遍历一个列表,并与二进制函数结合)在函数编程中非常常见。事实上,它很常见,有一个辅助函数,称为foldr. 所以你可以写

conjunction xs = foldr (&&) True xs

其中第一个参数指定组合函数,第二个参数指定列表为空时的值。

或者你可以只使用一个已经定义的函数,比如

conjunction = and
于 2013-11-12T17:36:44.057 回答
1

这是一些工作代码,基于 J. Abrahamson 的评论 -

data MyBool = MyTrue | MyFalse | And MyBool MyBool deriving (Show)



main = do
    print $ foldr1 And [MyTrue, MyFalse, MyTrue, MyTrue, MyFalse, MyTrue]

(我假设你的大写“And”是一个构造函数而不是一个错字......)

这不包括 [] 的情况,您可以使用模式匹配将其拉出。

于 2013-11-13T04:17:45.857 回答