我刚刚开始我的Haskell之旅,直到我遇到了currying,部分应用程序和更高阶函数(即当它开始变得有趣时)我正在飞行 - 是的我知道介绍的东西很容易这可能是这样的东西!)
无论如何,这个问题是关于更高阶函数。 从一个众所周知的教程中给出这个例子
applyTwice :: (a -> a) -> a -> a
applyTwice f x = f (f x)
我可以看到它是如何运作的,如果我暂停我的怀疑,我相信我理解它。然而,令我困惑的是,为什么这并不能解决问题。当我们重新进入回调时调用f(f x),我们肯定会再次模式匹配。我在这里错过了什么?
答案 0 :(得分:7)
这不会递归,因为applyTwice
不是递归调用的。这可能有点重复,所以让我们看一下评估痕迹。
inc :: Int -> Int
inc n = n + 1
applyTwice inc 3
(\f x -> f (f x)) inc 3
(\x -> inc (inc x)) 3
inc (inc 3)
当f
成为inc
而x
成为3
后,我们发现所有applyTwice
都会采用其第一个参数,并将其应用于它的第二个参数。
答案 1 :(得分:6)
递归是在自己的定义中应用函数。在这里,我们没有这种情况。让我们看看如果我们定义一个函数square
并将其与applyTwice
一起使用会发生什么:
square :: Int -> Int
square x = x * x
现在让我们按照以下功能应用程序的评估:
applyTwice square 3 => square (square 3) => square 9 => 81