我试图让一个带有foldr的函数在一个列表中工作,该列表具有3> 4,...等值,如果列表中的值为真,则返回True。到目前为止我已经尝试过这样做了:
fold :: [Bool] -> Bool
fold xs = foldr (x==True) xs
where x:xs
答案 0 :(得分:5)
您想要and xs
到"和"布尔值列表。同样,foldr (&&) True xs
或all 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 == True
与x
相同,那么我们可以简化该表达式:
foldr (\ x y -> x && y) True xn
但是Haskell对(\ x y -> x && y)
:(&&)
有一个特殊的符号,特别是因为这是一个常见的情况:
foldr (&&) True xn
并且,因为这个函数是一个常见的需求,它已经在标准库中有一个函数,称为and
:
and xn