我正在尝试从以下位置实现 K 组合器SK组合器演算 https://en.wikipedia.org/wiki/SKI_combinator_calculus#Informal_description在C++中。 K 组合器是高阶函数 https://en.wikipedia.org/wiki/Higher-order_function这基本上需要一些价值x
,并返回一些东西in turn取一个值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;
}
这些称为通用 lambda(自 C++14 起就存在),基本上就是您想要的。他们的operator()
是每个的模板auto
范围。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)