haskell - 高阶函数和缺乏递归

标签 haskell recursion higher-order-functions

我才刚刚开始我的 Haskell 之旅,直到我遇到柯里化(Currying)、部分应用程序和高阶函数(即当它开始变得有趣时),我才开始飞行 - 是的,我知道介绍的东西很简单,所以可能是这个东西!)

无论如何,这个问题是关于高阶函数的。 给定一个著名教程中的这个例子

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

我可以看到它是如何工作的,如果我暂停我的怀疑,我相信我理解它。但是,让我感到困惑的是为什么这不会递归。鉴于当我们重新进入回调时对 f (f x) 的调用,我们肯定会再次进行模式匹配。我在这里错过了什么?

最佳答案

这不会递归,因为 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 变成 incx 变成 3 我们看到所有的 applyTwice 确实是采用它的第一个参数,然后将它应用两次到它的第二个参数。

关于haskell - 高阶函数和缺乏递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24419697/

相关文章:

haskell - 导入语法 `import "cryptonite"Crypto.Hash` 中带引号的字符串是什么意思?

haskell - 'do' 表示法中的新范围

parsing - 调试Haskell读取函数

Scala:如何将元组元素转换为列表

c# - C# 中返回 void 的高阶函数

list - 在 Haskell 中,为什么没有一个 TypeClass 来表示可以像列表一样工作的东西呢?

javascript - 通过直接路径在树中查找路径

swift - 如何在 Swift 中构建递归函数以返回字符串?

javascript - 递归遍历 HTML DOM 并打印属性

javascript - 如何将单个对象内的两个数组合并为属性