簡體   English   中英

了解Haskell的過濾器

[英]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 ,應用於謂詞和列表,返回滿足謂詞的那些元素的列表;

 filter p xs = [x | x <- xs, px] 

要向不理解列表推導的人解釋它,您可能會說過filter有三種情況:

  1. (簡單的情況)當要過濾的列表為空時,結果也為空
  2. 當要過濾的列表的頭部滿足謂詞時,它是結果的一部分
  3. 否則,跳過頭部並過濾列表的其余部分

這些案例與您問題中定義的最后三行一一對應。

小的觸摸可以使定義更慣用,因此更容易閱讀:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM