![](/img/trans.png)
[英]understanding a Haskell function with filter and lambda expressions
[英]Understanding Haskell's filter
我知道Haskell的過濾器是一個高階函數(意思是一個函數,它接受另一個函數作為參數),它通過一個列表檢查哪個元素滿足某個布爾條件。
我不太明白它的定義:
filter:: (a->Bool)->[a]->[a]
filter p [] = []
filter p (x:y) | p x = x:filter p y
| otherwise = filter p y
我知道如果我將一個空列表傳遞給該函數,它只會返回一個空列表,但是如何讀取最后兩行?
它使用保護 ,如果你來自具有C風格語法的語言有點類似於switch
結構。
最后一個模式讀取:如果函數p
使用參數x
求值為true,則返回列表的頭部和列表的已過濾尾部。 否則只返回列表的過濾尾部。
您也可以像這樣重寫它:
filter p (x:y) = if ( p x ) then
x:filter p y
else
filter p y
filter
,應用於謂詞和列表,返回滿足謂詞的那些元素的列表; 即 ,filter p xs = [x | x <- xs, px]
要向不理解列表推導的人解釋它,您可能會說過filter
有三種情況:
這些案例與您問題中定義的最后三行一一對應。
小的觸摸可以使定義更慣用,因此更容易閱讀:
filter _ [] = []
filter p (x:xs)
| p x = x : filter p xs
| otherwise = filter p xs
對於一個空列表,謂詞可以是任何東西,下划線明確表明它在這種情況下不重要。
而不是匹配(x:y)
,使用(x:xs)
-think:“ex和exes” - 強調你將列表分成頭部(類型a
)和尾部(類型[a]
, 即 , a
)的列表。
最后,將遞歸調用排列成filter
可以讓讀者看到后一種情況省略了x
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.