【问题标题】:Implementing the primitive recursive combinator in C++在 C++ 中实现原始递归组合器
【发布时间】:2016-02-15 18:59:00
【问题描述】:

作为this question 关于K combinator 实施的后续行动,我正在尝试实施代表primitive recursion 的所谓R combinator

R a b zero = a
R a b (successor c) = b c (R a b c)

其中successorsuccessor function。 R的类型签名是

A → ((ℕ → (A → A)) → (ℕ → A))

我尝试使用以下代码实现它:

auto R = [](auto a) {
    return [=](auto b) {
        return [=](auto c) {
            if (c == zero) return a;
            else return b(c)(R(a)(b)(c - 1));
        };
    };
};

使用generic lambdas(来自 C++14)。不幸的是,我的编译器产生了以下错误:

error: variable 'R' declared with 'auto' type cannot appear in its own initializer
                    else return b(c)(R(a)(b)(c - 1));
                                     ^

问题似乎是 lambda 无法在自己的主体中引用自己。在保留auto模板参数的同时,有没有一种简洁/简洁的方法来解决这个问题?

有关原始递归函数的更多信息,请访问here

【问题讨论】:

    标签: c++ recursion lambda metaprogramming higher-order-functions


    【解决方案1】:

    您可以简单地将R 转换为命名函数或函子,可以通过这种方式引用。这比 lambdas 有点尴尬,但确实解决了问题。

    另一种典型的策略是 Y 组合 lambda,以便您可以将其作为参数访问。

    【讨论】:

    • 如何将R 转换为命名函数或函子,同时保留通用方面(即不必事先指定它将采用的类型)?
    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 2014-03-23
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多