Recursion 《外交政策》:什么是;订单“;“中的平均值”;“高阶”;功能?递归函数是否为“a”;“高阶”;功能?

Recursion 《外交政策》:什么是;订单“;“中的平均值”;“高阶”;功能?递归函数是否为“a”;“高阶”;功能?,recursion,functional-programming,Recursion,Functional Programming,当我们说“高阶”函数时,我怀疑“阶”的真正含义是什么?例如,我有一个嵌入式函数调用,如: f.g.h 那么它被称为“三阶”函数吗 “高阶”函数是静态函数累积的概念吗?当我有一个递归函数f,在运行时它的调用堆栈类似于f.f.f.f,我们能说f是高阶函数吗 非常感谢。顺序基本上是类型中箭头的嵌套级别 定义 数据的顺序 订单0:非功能数据 顺序1:域和范围为顺序0的函数 阶数2:域和范围为阶数1的函数 k阶:域和范围为k-1阶的函数 所以基本上零阶函数是没有函数的,一阶正规函数,只对数据进行运算

当我们说“高阶”函数时,我怀疑“阶”的真正含义是什么?例如,我有一个嵌入式函数调用,如:

f.g.h
那么它被称为“三阶”函数吗

“高阶”函数是静态函数累积的概念吗?当我有一个递归函数f,在运行时它的调用堆栈类似于f.f.f.f,我们能说f是高阶函数吗


非常感谢。

顺序基本上是类型中箭头的嵌套级别

定义

数据的顺序

  • 订单0:非功能数据
  • 顺序1:域和范围为顺序0的函数
  • 阶数2:域和范围为阶数1的函数
  • k阶:域和范围为k-1阶的函数
所以基本上零阶函数是没有函数的,一阶正规函数,只对数据进行运算,其他的都是高阶函数

(似乎有一个错误)

让我们来看一些(Haskell)示例:

-- no arrow, clearly some plain data
x :: Int
x = 0

-- one arrow, so it's a first-order function:
add2 :: Int -> Int
add2 = (+ 2)

-- still one arrow only:
add :: (Int, Int) -> Int
add = uncurry (+)

-- and this is a first-order function as well:
add4 :: Int -> Int
add4 = add2 . add2
如您所见,是否使用函数组合(高阶函数)来定义函数并不重要,重要的是它们的结果类型。因此,您的
f.g.h
f.f.f
示例只是一阶函数(假设
f
是一阶函数)

高阶函数的简单示例为多元函数:

-- two arrows! Looks like a second-order function
plus :: Int -> Int -> Int
plus = (+)
curried函数的类型实际上是
Int->(Int->Int)
,在这里我们可以清楚地看到它是一个一阶函数,因此它是二阶函数。输入的低阶(0)实际上并不重要

我们可以在一个更有趣的例子中看到同样的情况,函数组合:

compose :: ((b -> c), (a -> b)) -> a -> c
compose (f, g) x = f (g x)
这里,参数和结果都是一阶函数,因此
compose
是二阶函数

另一个例子是fixpoint组合器
fix::(a->a)->a
,它有一个一阶函数作为输入和一个零阶结果,使其总体为二阶

还有我们所知道的curried复合运算符

(.) :: (b -> c) -> ((a -> b) -> (a -> c))
甚至会被认为是一个三阶函数。

一个例子(javaish)

函数之一(函数…fs){
返回fs[new Random().nextInt(fs.length)];
}
双y=cos,sin,atan中的一个。适用于(1.23);

这是顺序2,有两个原因:参数类型,尤其是结果类型是函数。

我会将其计算为顺序2。你是从哪里知道这个定义的?这个词的起源很可能来自数学。
Function<Double, Double> oneOf(Function<Double, Double>... fs) {
     return fs[new Random().nextInt(fs.length)];
}

double y = oneOf(cos, sin, atan).applyTo(1.23);