加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在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()是每个自动参数的模板.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读