Boost C++ 库

...世界上最受尊敬、设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ Coding Standards

基本概念 - Boost C++ 函数库
基本概念

在 Phoenix 框架中,万物皆函数(actor 类),可以求值为 f(a..n),其中 n 是函数的元数,即函数期望的参数数量。运算符也是函数。例如,a + b 只是一个元数为 2(或二元)的函数。a + b 等同于 plus(a, b),a + b + c 等同于 plus(plus(a, b), c)。plus(plus(a, b), c) 是一个三元函数(元数为 3)。

有趣的是,甚至函数也可以返回函数。我们稍后就会明白这是什么意思。

柯里化(Currying),以著名逻辑学家 Haskell Curry 的名字命名,是函数式编程(或 FP)这一编程范式中的重要机制之一。围绕其背后的概念有许多理论,然而,最简单的说法是,“柯里化”一个函数就是或多或少地部分求值一个函数。以一个简单的伪 C++ 函数为例

    plus(x, y) { return x + y; }

例如。上面函数 'plus' 的完全求值是通过提供 x 和 y 参数来完成的。例如

    plus(3, 2)

将得到 5。另一方面,部分求值可以被认为是调用函数时不提供所有参数。这里有一个虚构的(非 C++)示例

    plus(?, 6)

这是什么意思,函数的返回结果是什么?首先,问号表示我们还没有这个参数,稍后提供。但是我们有第二个参数,也就是 6。现在,虽然完全求值的函数 plus(3, 2) 的结果是实际计算值 5,但部分求值的函数 plus(?, 6) 的结果是另一个(未命名的)函数(一个高阶函数。在 FP 中,未命名的函数称为 lambda 函数),这次,lambda 函数期望的参数少了一个

    plus(3, 2) --> 5
    plus(?, 6) --> unnamed_f_x_plus_6(x)

现在,我们可以使用 unnamed_f_x_plus_6,即表达式 plus(?, 6) 的结果,就像一个带有一个参数的函数一样。因此

    plus(?, 6)(3) --> 9

这可以理解为

    | plus(?, 6) | (3) |
    |_____f1_____|     |
    |_____f2___________|

对运算符也可以进行同样的操作。例如,上面的例子等同于

        3 + 2 --> 5
        ? + 6 --> unnamed_f_x_plus_6(x)

显然,像上面那样对 plus 函数进行部分求值在 C++ 中是无法直接实现的,因为我们必须提供函数期望的所有参数。简单来说,对 plus 函数进行柯里化在纯 C++ 中是不可能的。这时 Phoenix 框架就派上用场了。该框架提供了实现部分函数求值的工具。