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) 

其中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

回答

0

你可以簡單地把R到一個名爲函數或仿函數,它可以通過這種方式來引用。這比lambdas更笨拙,但確實解決了問題。

另一個典型的策略是Y組合起來的拉姆達這樣您就可以訪問它作爲一個參數。

+0

我怎麼可能把'R'到一個名爲函數或函數對象,同時保留通用方面(即沒有指定類型,將提前採取)? – user76284