문제

나는 작업을 도출하 Z-연결자에 의해 시작으로 계승 함수 및 파생은 다른 고정된 지점을 연결됩니다.무엇을 했는 파생?을 했는 미묘한 실수가?

단계는 다음과 같습니다 내가 수행(에서 JavaScript)

1.선언이 요인 기능

let fact = n =>
    n < 2 ? 1 : n * fact(n - 1)

2.변환을 연결자(폐 expression)

let fact = (self, n) =>
    n < 2 ? 1 : n * self(n - 1)

3.스레드 셀프화

기반으로 서명 fact(?, 7), 전달 fact 으로 첫 번째 인수가 합리적인 보 fact(fact,7).그래서 스레드에 매개 변수는 꼬리를 통해 전화:

let fact = (self, n) =>
    n < 2 ? 1 : n * self(self, n - 1)

사용량은 지금 fact(fact,7)5040

4.리팩터를 카레 양식

let fact = self =>
    n => n < 2 ? 1 : n * self(self)(n - 1)

5.이동 자 응용 프로그램을 지역 선언

let fact = self => {
    let f = n => self(self)(n)
    return n => n < 2 ? 1 : n * f(n - 1)
}

6.변환하자는 선언을 lambda expression

let fact = self =>
    (f =>
        n => n < 2 ? 1 : n * f(n - 1)
    )(
        n => self(self)(n)
    )

사용량은 아직도 fact(fact)(7)5040

7.별도의 계승현

let _fact = f => n =>
    n < 2 ? 1 : n * f(n - 1)

let fact = self =>
    (
        _fact
    )(
        n => self(self)(n)
    )

8.이동 자체-응용 프로그램에서 호출자는 신체

let _fact =
    f => n => n < 2 ? 1 : n * f(n - 1)

let fact = (() => {
    let innerFact = self =>
        (
            _fact
        )(
            n => self(self)(n)
        )
    return innerFact(innerFact)
})()

사용량은 지금 fact(7)5040

9.변환하자는 선언을 lambda expression

let _fact =
    f => n => n < 2 ? 1 : n * f(n - 1)

let fact = (() => {
    return (
        innerFact => innerFact(innerFact)
    )(
        self => (_fact)(n => self(self)(n))
    )
})()

10.단순화하는 표정

let _fact =
    f => n => n < 2 ? 1 : n * f(n - 1)

let fact =
    (innerFact => innerFact(innerFact))
    (self => (_fact)(n => self(self)(n)))

정신을 확인합니다.사용량은 아직도 fact(7)5040

11.이름 바꾸기 변수

의 사용 innerFactself 보 의심 비슷합니다.이름 바꾸기 같은 변수를 발견했습니다.별도의 어휘는 범위 안전하게 수행:

let _fact =
    f => n => n < 2 ? 1 : n * f(n - 1)

let fact =
    (u => u(u))
    (u => (_fact)(n => u(u)(n)))

12.추상 _fact 사용법과 이름 바꾸기 fact

이름 바꾸기 fact 하기 setup 추상 _fact 에 의해 몸체와 매개변수 f

let _fact =
    f => n => n < 2 ? 1 : n * f(n - 1)

let setup = f =>
    (u => u(u))
    (u => (f)(n => u(u)(n)))

let fact = setup(_fact)

_fact 선언을 인라인:

let setup = f =>
    (u => u(u))
    (u => (f)(n => u(u)(n)))

let fact = setup(
    f => n => n < 2 ? 1 : n * f(n - 1)
)

13.이름 바꾸기 setup

이름 바꾸기에 그것이 무엇입니까?What 연결자는 이?에 따라 Wikipedia Z 연결자입니다:

let Z = f => 
    (u => f(v => u(u)(v)))
    (u => f(v => u(u)(v)))

하지만 나는 파생은:

let setup = f =>
    (u => u(u))
    (u => (f)(n => u(u)(n)))

정의 fact 의 관점에서 어느 것에 해당하는 동작입니다.았습니다.나는 실수로 재발견 또 다른 잘 알려진 연결?

도움이 되었습니까?

해결책

면 나는 인라인 (u => (f)(n => u(u)(n)))(u => u(u)) 을 얻을:

(u => f(n => u(u)(n)))
(u => f(n => u(u)(n)))

는 정확하게 Z 연결됩니다.

에서 위키피디아

let Z = f => 
    (u => f(v => u(u)(v)))
    (u => f(v => u(u)(v)))

나의 유도:

let fix = f =>
    (u => f(n => u(u)(n)))
    (u => f(n => u(u)(n)))
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 cs.stackexchange
scroll top