在C++中实现(类型化)K组合器

use*_*284 3 c++ templates metaprogramming functor higher-order-functions

我试图用C++中的SK组合子演算来实现K组合子.在K组合子是一个高阶函数,基本上需要一些值x,并返回一些东西,需要一个值y,并返回x从它.换一种说法,

K(x)(y) == x
Run Code Online (Sandbox Code Playgroud)

或者一步一步:

intermediate = K(x)
intermediate(y) == x
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

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

yur*_*hek 8

Lambdas不能是模板.你可以这样做:

#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;
}
Run Code Online (Sandbox Code Playgroud)

这些被称为通用lambda(从C++ 14开始存在),基本上就是你想要的.它们operator()是每个auto参数的模板.