高阶函数和缺少递归

bru*_*use 2 recursion haskell higher-order-functions

我刚刚开始我的Haskell之旅,直到我遇到了currying,部分应用程序和更高阶函数(即当它开始变得有趣时)我正在飞行 - 是的我知道介绍的东西很容易,所以这个东西大概!)

无论如何,这个问题是关于更高阶函数.从一个众所周知的教程中给出这个例子

applyTwice :: (a -> a) -> a -> a  
applyTwice f x = f (f x)
Run Code Online (Sandbox Code Playgroud)

我可以看到它是如何工作的,如果我暂停我的怀疑,我相信我理解它.然而,令我感到困惑的是,为什么这不能解决问题.当我们重新进入回调时调用f(fx),我们肯定会再次模式匹配.我在这里错过了什么?

J. *_*son 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)
Run Code Online (Sandbox Code Playgroud)

随着f变成incx变得3我们看到所有人applyTwice都采取它的第一个参数,并且,将其应用两次到它的第二个参数.


Cod*_*ice 6

递归在其自己的定义中应用函数.在这里,我们没有这种情况.让我们来看看如果我们定义一个函数square并将其用于applyTwice以下内容会发生什么:

square :: Int -> Int
square x = x * x
Run Code Online (Sandbox Code Playgroud)

现在让我们按照以下函数应用程序的评估:

applyTwice square 3 => square (square 3) => square 9 => 81
Run Code Online (Sandbox Code Playgroud)

  • 有趣的事实:大多数Haskellers可能会定义`applyTwice`,所以它看起来几乎与`square`相同,即`applyTwice f = f.F`.也许这使得更清楚的是没有递归,因为基本上我们只是"平方"一个函数.(或者说加倍,如果这是我们正在讨论的教会数字.) (2认同)