当我们说“高阶”功能时,我怀疑“秩序”的真正含义是什么?例如,我有一个嵌入式函数调用,如:
f.g.h
它被称为“3阶”功能吗?
“高阶”功能是静态功能积累的概念吗?然后,当我有一个递归函数f,并在运行时它的调用堆栈就像f.f.f.f.我们可以说f是高阶函数吗?
非常感谢。
答案 0 :(得分:4)
顺序基本上是类型中箭头的嵌套级别。
This lecture slide on Functional Programming定义
数据顺序
- 订单0:非功能数据
- 订单1:域名和范围为0的函数
- 订单2:具有域和范围1的函数
- 订单k:具有域和范围k-1的函数
所以基本上第零阶函数不是函数,只对数据进行操作的一阶正规函数,其他所有函数都是高阶函数。
(These slides似乎有一个错误的错误)
让我们来看一些(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
示例只是一阶函数(假设f
为1)。
高阶函数的简单示例是多变量函数:
-- two arrows! Looks like a second-order function
plus :: Int -> Int -> Int
plus = (+)
curried函数的类型实际上是Int -> (Int -> Int)
,我们可以清楚地看到它是一个函数,它具有一阶函数作为结果,所以它是2阶。输入的低阶( 0)并不重要。
我们可以在一个更有趣的例子中看到相同的功能组成:
compose :: ((b -> c), (a -> b)) -> a -> c
compose (f, g) x = f (g x)
这里两个参数和结果都是一阶函数,因此compose
的顺序为2。
另一个例子是fixpoint combinator fix :: (a -> a) -> a
,它具有一阶函数作为输入和一个零阶结果,使其整体为二阶。
我们知道的咖喱组合操作员
(.) :: (b -> c) -> ((a -> b) -> (a -> c))
甚至可以被视为三阶函数。
答案 1 :(得分:1)
一个例子(javaish)
Function<Double, Double> oneOf(Function<Double, Double>... fs) {
return fs[new Random().nextInt(fs.length)];
}
double y = oneOf(cos, sin, atan).applyTo(1.23);
这是第2阶,原因有两个:参数类型,特别是结果类型是函数。