Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.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
Haskell第一个语句静态结果,随累加器更改_Haskell_Recursion - Fatal编程技术网

Haskell第一个语句静态结果,随累加器更改

Haskell第一个语句静态结果,随累加器更改,haskell,recursion,Haskell,Recursion,我需要了解此代码的工作原理: myLength :: [a] -> Int myLength [] = 0 myLength (_:xs) = 1 + myLength xs 如果我正确理解递归,此函数将“重复”此代码: 如果列表不是空的,则转到下一步并执行任何操作 但当列表为空时,它将在第一个列表中停止,并应返回0 如果它使用像n这样的全局变量并执行如下操作,我可以理解: myLength [] = n myLength (_:xs) =

我需要了解此代码的工作原理:

myLength           :: [a] -> Int
myLength []        =  0
myLength (_:xs)    =  1 + myLength xs
如果我正确理解递归,此函数将“重复”此代码:

  • 如果列表不是空的,则转到下一步并执行任何操作

  • 但当列表为空时,它将在第一个列表中停止,并应返回0

如果它使用像n这样的全局变量并执行如下操作,我可以理解:

myLength [] = n
myLength (_:xs) = (n+1) + myLength xs

它不起作用,但思想就在那里,有一个值'n',并在每次迭代中递增它。

当您编写时,它是递归

让我们从原则上看一下调用的执行:

myLength "abc"
匹配第二个重载,所以我们得到

1 + myLength "bc"
其中递归调用再次匹配第二个重载,因此等于

1 + 1 + myLength "c"
这等于

1 + 1 + 1 + myLength ""
我们已经到达了基本情况

myLength [] = 0
因此递归终止,结果是

1 + 1 + 1 + 0
请注意,当基本情况“返回0”时,这是函数的特定应用程序的结果,而不是初始调用的结果

这里的关键是函数的每个应用程序都会产生一个值。 也就是说,您不需要“进行下一步并做任何事情”,而是将一个值添加到尾部的长度(这是一个值)。因此,您不需要一些全局状态(事实上,这只会使事情变得复杂)


另外,请注意,不涉及赋值,函数定义了等式,因此左侧可以被右侧替换。

您只是一个谷歌查询,无法理解递归是如何工作的。关于这个主题有很多精彩的教程,不要浪费了。在Haskell中,你不能增加变量:所有变量都是不可变的。所以,一旦你将它设置为某个值,它就会保持该值。这首先需要一些创造性,但最终会减少代码中的错误,因为您可以始终安全地假设值保持不变。伟大的想法@WillemVanOnsem,我在笔记的第一页写下它,谢谢