2014-09-12 2 views
2

저는 Y Combinator를 연구 해왔고, 어떻게 종이에서 작동 하는지를 알았지 만, 프로그래밍 언어로 어떻게 구현할 수 있는지 아직 모르겠습니다. 이 페이지에 따르면 javascript와 elixir에서 Y- 결합 자 구현

: http://matt.might.net/articles/implementation-of-recursive-fixed-point-y-combinator-in-javascript-for-memoization/

Y 연결자의 유도가 간다 :

Y(F) = F(Y(F)) 
# Of course, if we tried to use it, it would never work because the function Y immediately calls itself, leading to infinite recursion. 
# Using a little λ-calculus, however, we can wrap the call to Y in a λ-term: 
Y(F) = F(λ x.(Y(F))(x)) 
# Using another construct called the U combinator, we can eliminate the recursive call inside the Y combinator, which, with a couple more transformations gets us to: 
Y = (λh.λF.F(λ x.((h(h))(F))(x))) (λh.λF.F(λ x.((h(h))(F))(x))) 

그는 어떻게 λ x.(Y(F))(x)을 할 Y(F) 확장 할 수 있습니다? U Combinator는 어떻게 사용할 수 있습니까? 이런 식이면

# javascript 
var Y = function (F) { 
    return (function (x) { 
     return F(function (y) { return (x(x))(y);}); 
    })(function (x) { 
     return F(function (y) { return (x(x))(y);}); 
    }); 
}; 

# elixir 
defmodule Combinator do 
    def fix(f) do 
     (fn x -> 
      f.(fn y -> (x.(x)).(y) end) 
     end).(fn x -> 
      f.(fn y -> (x.(x)).(y) end) 
     end) 
    end 
end 

: Y = \f.(\x.f(x x))(\x.f(x x)), F의 관계 람다 식 (X), 및 F, X 무엇 Y는로, 여기

자바 스크립트 및 엘릭서의 구현 위의 구현? x는 같은 x처럼 보이고, f는 같은 f와 같습니다. 그렇다면 y은 무엇입니까? 특히 x x에 해당하는 람다가 y을 사용하는 함수로 래핑되는 이유는 무엇입니까?

y은 함수의 인수와 비슷합니다.

+2

당신은 Jim Weirich의 Ruby 기능성 프로그래밍에서이 비디오를 시청해야합니다. 이야기하는 동안 그는 Y Combinator를 단계별로 파생시킵니다. 매우 인상적이고 교육적이며 재미있는 영화입니다! https://www.youtube.com/watch?v=FITJMJjASUs –

답변

2

y 인자는 함수의 인수와 비슷합니까?

예. 람다 미적분은 암시 적으로 curried입니다. x x 대신 \y.x x y을 쓸 수도 있습니다.

+0

"Y-combinated"함수에 인수가 없으므로'x x '를 래핑 할 필요가없는 경우가 있습니까? 또는 "Y 결합 된"모든 함수는 재귀 적 재귀 함수이므로 매개 변수를 갖습니다. 의미 론적 레이블을 부여한다면 "x"라고 부를 수도 있을까요? – CMCDragonkai

+0

더 중요한 것은 카레트 인자가 항상 있다면, 왜 λ 계산식은'Y = \ f. (\ x.f (x x)) (\ x.f (x x))'에 그것을 나타내지 않는가? 'x x'에 인수가 필요하다고 명시된 것이 있다면 그것이 더 명확 해지지 않을까요? – CMCDragonkai

+0

아니요, Y 결합자를 단 하나의 매개 변수 함수의 고정 점으로 명시 적으로 정의합니다 (다른 모든 요소는 의미가 없습니다). 나는'x' 함수의 이름이 있는지 모르겠습니다. – Bergi