1
作爲後續this question關於K combinator的實施,我想實現所謂R combinator代表primitive recursion原始遞歸組合子:實現在C++
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。
我怎麼可能把'R'到一個名爲函數或函數對象,同時保留通用方面(即沒有指定類型,將提前採取)? – user76284