Y Combinator學習總結

最近看完The little schemer,第一次看到這種編排的書,一問一答的形式,不知不覺就翻完了整本。很天然的教會你們寫遞歸,怎樣寫程序,一點點的CPS,還有Y combinator。 我的以爲第九章推導Y combinator過程是我看到的最清晰,簡單的一個了,只要花點耐心,就能學會。html

scheme版本Y組合子git

(define Y
  (lambda (le) 
    ((lambda (f) (f f)) 
      (lambda (f) 
        (le (lambda (x) ((f f) x)))))))

直接翻譯爲erlang代碼github

Y = fun(M) -> 
  (fun(F) -> F(F) end)(
    fun(F) ->
      M(fun(X) -> (F(F))(X) end) 
    end
  ) 
end.

這樣看起來不怎麼清晰,抽取函數體,定義爲變量,再帶入fun(F) -> F(F) end即得到函數

Y = fun(M) -> 
  G = fun (F) -> M(fun(X) -> (F(F))(X) end) end,
  G(G)
end.

Y組合子是用於lambda演算中實現遞歸邏輯的,便是能夠實現匿名函數的遞歸調用。原理就是fixed-point combinator,不動點組合子。高階函數f的不動點是另外一個函數 g,使得f(g) = g。那麼不動點算子是任何函數fix使得對於任何函數f都有f(fix(f)) = fix(f)。這樣就能夠實現匿名函數把本身算出來,從而間接調用回本身,實現遞歸了。學習

Fac = fun (F) ->
  fun (0) -> 1;
    (N) -> N * F(N-1)
  end
end.

(Y(Fac))(5). % 120

BTW, Erlang R17之後支持Named Function [1][2],如今遞歸能夠寫成翻譯

Fun = fun Fact(N) when N > 0 ->
      N * Fact(N - 1);
    Fact(0) ->
      1
end.

Fun(5). % 120

參考:code

相關文章
相關標籤/搜索