【发布时间】: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)
其中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。
【问题讨论】:
标签: c++ recursion lambda metaprogramming higher-order-functions