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

haskell中列表上的fold函数,如果值为true,则返回true,haskell,Haskell,我试图用foldr获得一个函数来处理一个值为3>4的列表,。。。如果列表中的值为True,则返回True。到目前为止,我已经尝试过这样做: fold :: [Bool] -> Bool fold xs = foldr (x==True) xs where x:xs 您需要和xs来“和”布尔值列表。同样地,foldr(&&)True xs或所有id xs也可以工作 回想一下,foldr接受一个函数(例如(&&&&))和一个基本情况(例如True)。您的代码两者都缺少。Has

我试图用foldr获得一个函数来处理一个值为3>4的列表,。。。如果列表中的值为True,则返回True。到目前为止,我已经尝试过这样做:

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

您需要
和xs
来“和”布尔值列表。同样地,
foldr(&&)True xs
所有id xs
也可以工作


回想一下,
foldr
接受一个函数(例如
(&&&&)
)和一个基本情况(例如
True
)。您的代码两者都缺少。

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

foldr (\ x y -> ...) z xn
如果
xn
为空,则计算结果为
z
。否则,该值将成为函数的主体(函数的值,
),不管是什么。您希望函数仅在某些条件下为true,因此您可能希望该表达式是
&&
运算符的应用程序:

foldr (\ x y -> ... && ...) z xn
x
是第一个元素的值,您希望为true:

foldr (\ x y -> x == True && ...) z xn
foldr (\ x y -> x == True && y) z xn
y
的意思是“其他元素的情况类似”,您也希望这样:

foldr (\ x y -> x == True && ...) z xn
foldr (\ x y -> x == True && y) z xn
当没有元素时,需要为
z
传递所需的值。如果按惯例没有任何元素,它们都是“全部”true,因此您希望
true
适用于这种情况:

foldr (\ x y -> x == True && y) True xn
现在,如果
x
已经是布尔值,
x==True
x
相同,那么我们可以简化该表达式:

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

foldr (&&) True xn
而且,因为这个函数是一个常见的需求,所以标准库中已经有一个函数,叫做

and xn