作为this question关于K combinator实施的后续行动,我正在尝试实施代表R combinator的所谓primitive recursion:
R a b zero = a
R a b (successor c) = b c (R a b c)
其中successor
是successor 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。
答案 0 :(得分:0)
您可以简单地将R
转换为命名函数或仿函数,这可以通过这种方式引用。这比lambdas更尴尬,但确实解决了这个问题。
另一个典型的策略是Y合并lambda,以便您可以作为参数访问它。