我試圖讓一個函數與foldr工作在一個列表上,其值爲3> 4,...等,並返回True如果值列表是真實的。我試過做到目前爲止:haskell中的列表上的函數返回true如果值爲true
fold :: [Bool] -> Bool
fold xs = foldr (x==True) xs
where x:xs
我試圖讓一個函數與foldr工作在一個列表上,其值爲3> 4,...等,並返回True如果值列表是真實的。我試過做到目前爲止:haskell中的列表上的函數返回true如果值爲true
fold :: [Bool] -> Bool
fold xs = foldr (x==True) xs
where x:xs
你想要and xs
「和」布爾值列表。等效地,foldr (&&) True xs
或all id xs
也可以工作。
回想foldr
需要函數(例如(&&)
)和基礎案例(例如True
)。你的代碼缺乏。
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