을 도출하려 Z 연결자는 대신 또 다른 파생
-
29-09-2020 - |
문제
나는 작업을 도출하 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.이름 바꾸기 변수
의 사용 innerFact
고 self
보 의심 비슷합니다.이름 바꾸기 같은 변수를 발견했습니다.별도의 어휘는 범위 안전하게 수행:
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)))
제휴하지 않습니다 cs.stackexchange