介绍:
通常在编程时,我们使用一等函数,这意味着编程语言将函数视为值——您可以将函数分配给变量,传递它。这些函数不以其他函数为参数,也没有任何函数作为其返回类型。为了克服一等函数的所有这些缺点,引入了高阶函数的概念。
为什么我们需要它们?
在像 (C/C++) 这样的命令式编程语言中,我们经常使用函数,或者实际上我们可以说函数在用这些语言编程时起着重要作用。一个典型的函数可以通过函数名、返回类型和参数来定义。我们通常将 int、char、pointer 等作为参数,但是是否可以将一个函数作为参数提供给另一个函数,或者一个函数可以返回另一个函数作为结果?
答案是肯定的!将至少一个函数作为参数或返回一个函数作为结果或执行两者的函数称为高阶函数。许多语言,包括 – Javascript、Go、Haskell、 Python、C++、C# 等,都支持高阶函数。它是函数式编程的一个很好的工具。
咖喱:
函数可以根据它们接受的输入数量进行分类,例如二元函数将接受两个输入,而一元函数将只接受一个输入。在 Haskell 中,每个函数只接受一个输入,因此 Haskell 中的每个函数都可以说是一元的。那么不可能实现一个带有多个参数的函数?当然,这是可能的,通过一种叫做柯里化的方法(以 Haskell Curry 的名字命名,科学家让这种方法流行起来并发明了 Haskell)。在柯里化中,每个函数只接受一个参数并返回一个函数。而本系列中的最后一个函数将返回所需的输出。
钻营是平移的是采用多个参数到评估的功能的序列,每个具有单个参数的函数的评价的方法。
一个简单的咖喱示例:
让我们举个例子,PLUS是一个将两个数字相加的函数
- 我们希望将两个数字 X 和 Y 相加。 X 将作为 PLUS函数的输入,该函数返回一个名为 PLUS X 的函数。
- PLUS X函数取一个数字并在其上加 X。现在此函数的输入将是 Y。最终输出将是 X + Y。
高阶函数的优点:
通过使用高阶函数,我们可以轻松解决许多问题。例如,我们需要构建一个函数,它接受一个列表和另一个函数作为输入,将该函数应用于该列表的每个元素并返回新列表。在 Haskell 中,这可以使用称为 map 的内置高阶函数轻松完成。 map 的定义是:
map :: (a -> b) -> [a] -> [b]
map _ [ ] = [ ]
map f (x : xs) = f x : map f xs
这里,
- 第一行是函数初始化。
- ::符号代表“属于该类型”。
- [a]表示相似元素的列表,实体写在 last -> 之后总是函数的返回类型。Haskell 中的函数总是只返回一个实体。
- (a->b)定义了一个从 ‘a’ 到 ‘b’ 的函数。我们使用递归来定义映射,
[]表示空列表, _表示“任何东西”。 - 第二行描述了如果输入空列表和任何函数,则输出将是空列表。
- x : xs用于从列表中一个一个地取出元素,x 是第一个元素(头),xs 是剩余的列表(尾)。 :符号代表串联。所以简而言之,第三行是从列表中取出每个元素并对它们应用函数’f’ 并将其与剩余的列表连接起来。
例子:
map (+7) [1, 2, 3, 4, 5]
will return the list [8, 9, 10, 11, 12]. Here +7 is the function.