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
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,我在笔记的第一页写下它,谢谢