C++ and currying

C++ and currying

本文关键字:currying and C++      更新时间:2023-10-16

我有代码:

#include <iostream>
using namespace std;
auto fn = ([](int x){
       return [x](int y) {
          return x * y;
       };
});
int main() {
    int i = fn(2)(4); // 8
    cout << i << endl;
    return 0;
}

此代码工作正常。但是,我想稍后调用第二个函数,例如:

auto i = fn(2);
i(4); //error: 'i' cannot be used as a function

有没有办法稍后调用最后一个函数,然后绑定第一个调用?

以下工作符合预期

#include <iostream>
using namespace std;
auto fn = [](int x){
       return [x](int y) {
          return x * y;
       };
  };
int main() {
    auto i = fn(2)(4); // 8
    cout << i << endl;
    auto j = fn(2);
    cout << j(4) << endl;
    return 0;
}

顺便说一下,如果你使用 int 而不是 auto,带有 -std=c++0x 的 gcc 4.5 会给出以下错误:

currying.cpp:17:17: error: cannot convert ‘<lambda(int)>::<lambda(int)>’ to ‘int’ in initialization
currying.cpp:19:16: error: ‘j’ cannot be used as a function

这是一个"明显"且有用的信息,可以了解出了什么问题。

fn的结果

不是整数,因此您不能将fn(2)分配给整数(甚至不知道为什么要编译)。

你应该能够做auto i = fn(2);

这对

我有用:

int main() {
    auto i = fn(2);
    cout << i(4) << endl;  // prints 8
    return 0;
}