在C ++中实现原始递归组合子

时间:2016-02-15 18:59:00

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

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

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

1 个答案:

答案 0 :(得分:0)

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

另一个典型的策略是Y合并lambda,以便您可以作为参数访问它。