Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 解释递归Haskell列表函数是如何工作的?_List_Haskell_Recursion - Fatal编程技术网

List 解释递归Haskell列表函数是如何工作的?

List 解释递归Haskell列表函数是如何工作的?,list,haskell,recursion,List,Haskell,Recursion,我知道下面的函数是什么,我只想解释一下它是如何工作的以及进行的计算: sponge :: Int -> [a] -> [a] sponge 0 xs = xs sponge n [] = [] sponge n (x:xs) = sponge (n-1) xs 我现在似乎已经失去了所有的情节:( 如果能帮我重回正轨,我将不胜感激!:)正如您所见,它需要两个参数:一个Int和一个list。它通过模式匹配来区分三种情况:1)Int为零;2) 列表为空;或者,3)Int不是零,列表也不是

我知道下面的函数是什么,我只想解释一下它是如何工作的以及进行的计算:

sponge :: Int -> [a] -> [a]
sponge 0 xs = xs
sponge n [] = []
sponge n (x:xs) = sponge (n-1) xs
我现在似乎已经失去了所有的情节:(


如果能帮我重回正轨,我将不胜感激!:)

正如您所见,它需要两个参数:一个Int和一个list。它通过模式匹配来区分三种情况:1)Int为零;2) 列表为空;或者,3)Int不是零,列表也不是空的

在案例1中,它返回列表;在案例2中,它返回空列表(第二个参数就是空列表);在案例3中,它使用原始Int参数减去1和原始列表减去第一个元素递归调用自己


它看起来很像前奏曲中的“drop”。

它是两个变量上的递归函数。你可以把它一行一行地分开来理解它:

sponge :: Int -> [a] -> [a]
两个参数,一个是
Int
,一个是一些元素的列表

sponge 0 xs = xs
基本情况。如果
Int
参数为零,只需返回未修改的列表参数即可

sponge n [] = []    
另一个基本情况是,如果列表为空,则立即返回空列表

sponge n (x:xs) = sponge (n-1) xs
最后,归纳步骤。如果列表非空(即,至少由一个元素和一个尾部组成,由
x:xs
表示),则结果是
海绵
调用
n-1
和列表的尾部

那么这个函数将做什么呢?在删除
n
元素后,它将返回列表的尾部。它与
drop
功能相同:

> drop 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
为正的情况,函数的行为类似于drop


下面是
n
xs
中间值的跟踪,通过以下方式获得:


你说你已经失去了剧情,偏离了正轨,但是你没有给出你不明白的线索。这很重要,因为这段代码只需要对Haskell有一个非常基本的了解。这里有语法你不明白吗?这个问题是以一种误导的方式编辑的。通过添加OP没有使用的“递归”一词,它给人的印象是OP遇到了递归问题,但我们不知道OP遇到了递归问题。。。甚至OP知道什么是递归,或者知道函数是递归的。@Jim Balter添加了“递归”一词,以便我们以后可以在适当的术语下找到答案。“解释此功能”等标题不可搜索。
> quickCheck $ \n xs -> n >= 0 ==> sponge n xs == drop n xs
+++ OK, passed 100 tests.