如果值为true,则haskell中列表上的fold函数返回true

时间:2014-10-16 20:16:38

标签: haskell

我试图让一个带有foldr的函数在一个列表中工作,该列表具有3> 4,...等值,如果列表中的值为真,则返回True。到目前为止我已经尝试过这样做了:

fold :: [Bool] -> Bool
fold xs = foldr (x==True) xs
        where x:xs

2 个答案:

答案 0 :(得分:5)

您想要and xs到"和"布尔值列表。同样,foldr (&&) True xsall id xs也可以。

回想一下,foldr采用功能(例如(&&))和基本情况(例如True)。你的代码都没有。

答案 1 :(得分:4)

Haskell为您提供了对程序中发生的事情的极大控制,但您必须明确说出您想要发生的一切。特别是,如果您查看对foldr的调用:

foldr (\ x y -> ...) z xn

如果xn为空,则评估为z。否则,该值将是函数的主体(...的值),无论是什么。您希望该函数仅在某些条件下为真,因此您可能希望该表达式成为&&运算符的应用程序:

foldr (\ x y -> ... && ...) z xn

x是第一个元素的值,您希望它是真的:

foldr (\ x y -> x == True && ...) z xn

y同样适用于其他元素',您也希望如此:

foldr (\ x y -> x == True && y) z xn

当没有元素时,你需要传递z你想要的值。如果按照惯例没有元素,那么他们就是全部。是的,所以在这种情况下你需要True

foldr (\ x y -> x == True && y) True xn

现在,如果x已经是布尔值,x == Truex相同,那么我们可以简化该表达式:

foldr (\ x y -> x && y) True xn

但是Haskell对(\ x y -> x && y)(&&)有一个特殊的符号,特别是因为这是一个常见的情况:

foldr (&&) True xn

并且,因为这个函数是一个常见的需求,它已经在标准库中有一个函数,称为and

and xn