[英]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 调试器获得的n
和xs
的中间值的跟踪:
如您所见,它有两个参数:一个 Int 和一个列表。 它通过模式匹配来区分三种情况: 1) Int 为零; 2)列表为空; 或者,3) Int 不为零,列表也不为空。
在案例 1 中,它返回列表; 在情况 2 中,它返回空列表(无论如何,这是第二个参数); 在第 3 种情况下,它使用原始 Int 参数减去 1和原始列表减去其第一个元素递归调用自身。
它看起来很像 Prelude 中的“drop”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.