在C中实现(类型化)K组合子
发布时间:2020-12-16 10:12:29 所属栏目:百科 来源:网络整理
导读:我正在尝试从C中的 SK combinator calculus实现K组合器. K组合器是一个 higher-order function,它基本上取一些值x,然后返回一些东西,它依次取值y并从中返回x.换一种说法, K(x)(y) == x 或者一步一步: intermediate = K(x)intermediate(y) == x 将K(x)视为一
我正在尝试从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的东西的能力是必不可少的.此外,在简单地创建K(x)而不在y上调用它时,不必指定y的类型.一旦在代码中的某处评估K(x)(y),就可以指定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; } 它输出错误:模板特化中的无关模板参数列表或外部模板定义.我试过调整模板参数并移动它们无济于事.有谁知道我怎么能解决这个错误? 解决方法
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; } 这些被称为通用lambda(从C 14开始存在),基本上就是你想要的.它们的operator()是每个自动参数的模板. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读