簡體   English   中英

解釋遞歸 Haskell 列表 function 是如何工作的?

[英]Explain how a recursive Haskell list function works?

我知道下面的 function 做了什么我只想解釋它是如何工作的以及發生的計算:

sponge :: Int -> [a] -> [a]
sponge 0 xs = xs
sponge n [] = []
sponge n (x:xs) = sponge (n-1) xs

我現在似乎失去了 plot :(

任何能讓我重回正軌的幫助將不勝感激::)

它是兩個變量上的遞歸 function。 您可以將其逐行分解以理解它:

sponge :: Int -> [a] -> [a]

兩個 arguments,一個是Int ,一個是一些元素的列表。

sponge 0 xs = xs

基本情況。 如果Int參數為零,則只返回未修改的列表參數。

sponge n [] = []    

另一種基本情況,如果列表為空,則立即返回空列表。

sponge n (x:xs) = sponge (n-1) xs

最后是歸納步驟。 如果列表非空(即由至少一個元素和一個尾部組成,用x:xs表示),則結果是調用n-1和列表尾部的sponge

那么這個function會做什么呢? 刪除n元素后,它將返回列表的尾部。 drop function相同:

> drop 10 [1..20]
[11,12,13,14,15,16,17,18,19,20]

> sponge 10 [1..20]
[11,12,13,14,15,16,17,18,19,20]

其實我們可以通過 QuickCheck 來確認:

> quickCheck $ \n xs -> sponge n xs == drop n xs
*** Failed! Falsifiable (after 7 tests and 5 shrinks):    
-1
[()]

啊。 他們是不同的。 n為負時:因此我們可以修改與兩個函數相關的屬性:

> quickCheck $ \n xs -> n >= 0 ==> sponge n xs == drop n xs
+++ OK, passed 100 tests.

因此,對於n為正數的情況,您的 function 的行為類似於 drop。


這是通過hood 調試器獲得的nxs的中間值的跟蹤:

在此處輸入圖像描述

如您所見,它有兩個參數:一個 Int 和一個列表。 它通過模式匹配來區分三種情況: 1) Int 為零; 2)列表為空; 或者,3) Int 不為零,列表也不為空。

在案例 1 中,它返回列表; 在情況 2 中,它返回空列表(無論如何,這是第二個參數); 在第 3 種情況下,它使用原始 Int 參數減去 1和原始列表減去其第一個元素遞歸調用自身。

它看起來很像 Prelude 中的“drop”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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