繁体   English   中英

高阶函数和缺少递归

[英]Higher order functions and lack of recursion

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

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

applyTwice :: (a -> a) -> a -> a  
applyTwice f x = f (f x)

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

这不会递归,因为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都采用它的第一个参数,并且将其应用于其第二个参数两次。

递归在其自己的定义中应用函数。 在这里,我们没有这种情况。 让我们看看如果我们定义一个函数square并将其与applyTwice一起使用会发生applyTwice

square :: Int -> Int
square x = x * x

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

applyTwice square 3 => square (square 3) => square 9 => 81

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM