2014-10-16 39 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