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阶的函数
-- 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);