以下函数计算斐波那契数列:
fib = 0 : 1 : (zipWith (+) fib (tail fib))
Run Code Online (Sandbox Code Playgroud)
如果运行它,我们将得到一个无限列表,但是递归如何工作?如果函数不断调用自身,为什么会在屏幕上打印数字?如果您能解释编译器如何管理调用,将不胜感激。
在过去的两个小时中,我一直在阅读有关Haskell中的currying的信息,所有资源都介绍了具有多个参数的函数实际上是如何返回其他函数的,而不是其定义的样子,所以这就是问题所在。
让我们定义函数:
myFunc :: (Num a) => a -> a -> a
myFunc x y = x * 2 + x * y
Run Code Online (Sandbox Code Playgroud)
:t (myFunc 2)打印Num a => a -> a,即接受数字并输出数字的函数。但是,由返回的函数的定义是什么(myFunc 2)样的?编译器会代替x定义,新函数变成类似myFunc' y = 2 * 2 + 2 * y吗?
递归如何处理currying?如果我定义功能
replicate' :: (Integral i, Ord i) => i -> a -> [a]
replicate' n x
| n <= 0 = []
| otherwise = x : replicate' (n - …Run Code Online (Sandbox Code Playgroud)