我正在尝试从 C++ 中的 SK combinator calculus 实现 K 组合器。 K 组合器是一个 higher-order function ,它基本上采用一些值 x ,并返回一些值,而后者又采用值 y 并从中返回 x 。换句话说,

K(x)(y) == x

或逐步:
intermediate = K(x)
intermediate(y) == x

K(x) 视为独立于 y 的自在事物的能力是必不可少的。此外,在简单地创建 y 而没有在 K(x) 上调用它时,不需要指定 y 的类型。一旦 y 在代码中的某处被评估,就可以指定 K(x)(y) 的类型。

我正在尝试修复我编写的尝试实现 K 组合器的代码:
#include <iostream>

template<class A>
template<class B>
auto K = [](A x) {
    return [=](B y) {
        return x;
    };
};

int main()
{
    std::cout << "Hello world!\n";
    auto Kx = K<int>(3);
    auto Kxy = Kx<float>(4.5);
    std::cout << Kxy << std::endl;
}

它输出 error: extraneous template parameter list in template specialization or out-of-line template definition 。我试过调整模板参数并移动它们无济于事。有谁知道我如何解决这个错误?

最佳答案

Lambda 不能是模板。你可以这样做:

#include <iostream>

auto K = [](auto x) {
    return [=](auto y) {
        return x;
    };
};

int main()
{
    std::cout << "Hello world!\n";
    auto Kx = K(3);
    auto Kxy = Kx(4.5);
    std::cout << Kxy << std::endl;
}

这些被称为泛型 lambdas(自 C++14 以来就存在),基本上就是你想要的。他们的 operator() 是每个 auto 参数的模板。

关于c++ - 在 C++ 中实现(类型化)K 组合器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35403540/

10-11 11:50