FP:“订单”在“高阶”功能中意味着什么?递归函数是否为“高阶”函数?

时间:2016-07-20 06:19:18

标签: recursion functional-programming

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

f.g.h

它被称为“3阶”功能吗?

“高阶”功能是静态功能积累的概念吗?然后,当我有一个递归函数f,并在运行时它的调用堆栈就像f.f.f.f.我们可以说f是高阶函数吗?

非常感谢。

2 个答案:

答案 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.hf.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阶,原因有两个:参数类型,特别是结果类型是函数。