Haskell高阶连词

时间:2013-11-12 17:25:56

标签: haskell higher-order-functions

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

连接[a,b,c] ==和a(和b c)

我不确定在哪里做到最好的方法,我假设使用x:xs模式进行列表递归?

2 个答案:

答案 0 :(得分:3)

这是一个选项。如果列表中没有元素,那么按惯例它们的连接是True。你有

conjunction []     = True

如果有多个元素,则该元素为True,如果该元素为True,则所有其他元素的合并为True

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

这种特殊模式(一次迭代列表一个元素,并结合二进制函数)在函数编程中非常常见。实际上,它有一个辅助函数,称为foldr,这是很常见的。所以你可以写

conjunction xs = foldr (&&) True xs

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

或者您可以使用已定义的功能,例如

conjunction = and

答案 1 :(得分:1)

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

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



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

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

这不包括[]的情况,你可以使用模式匹配来提取。