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.我试过调整模板参数并移动它们无济于事.有谁知道我怎么能解决这个错误?
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参数的模板.