2014-10-16 62 views

回答

5

你想要and xs“和”布尔值列表。等效地,foldr (&&) True xsall id xs也可以工作。

回想foldr需要函数(例如(&&))和基础案例(例如True)。你的代码缺乏。

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 
相关问题