haskell中列表上的fold函数,如果值为true,则返回true
我试图用foldr获得一个函数来处理一个值为3>4的列表,。。。如果列表中的值为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
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