2016-09-24 3 views
0

중첩 된 기능 : 내가 ((twice)(trans))(plus_one)(1) 을 평가하려고 할 때나는 다음과 같은 기능 성분 주위에 내 머리를 정리 드릴 수 없습니다 구성

function plus_one(x) { 
    return x + 1; 
} 

function trans(f) { 
    return function(x) { 
     return 2 * f(2 * x); 
    }; 
} 

function twice(f) { 
    return function(x) { 
     return f(f(x)); 
    } 
} 

plus_one은 F f(2f(2x))=2f(2*2f(2x))=2f(4f(2x)) = 2*(4*(2 + 1)) = 24. 가정하고 그러나에 그것을 입력, 내가 무엇을 얻을 intrepreter는 그것이 20임을 보여줍니다.

어떤 도움을 주셔서 감사합니다.

많은 분들께 감사드립니다.

+0

왜'람다 calculus' 태그로

twice(trans)(plus_one)(1) 

을 평가할 수 있습니까? – naomik

답변

1

((twice)(trans))(plus_one)trans(trans(plus_one))이며,

trans(trans(plus_one)) (1) 
—> trans(λx.2 * plus_one(2*x)) (1) 
—> λy.2 * ((λx.2 * plus_one(2*x))(2*y) (1) 
—> 2 * (λx.2 * plus_one(2*x)) (2*1) 
-> 2 * 2 * plus_one(2*2) 
-> 2 * 2 * 5 
-> 20 
1
그것은 그들을 혼동하지의 다른 기능에 서로 다른 매개 변수 이름을 사용하는 것도 도움이 될 수 있습니다

. f은 항상 plus_one을 참조하지 않습니다.

plus_one = λ x0 ⇒ x0 + 1; 
trans = λ f0 ⇒ λ x1 ⇒ 2 * f0(2 * x1); 
twice = λ f1 ⇒ λ x2 ⇒ f1(f1(x2)); 

우리는

≡ (λ f1 ⇒ λ x2 ⇒ f1(f1(x2)))(trans)(plus_one)(1) 
≡ (λ x2 ⇒ trans(trans(x2)))(plus_one)(1) 
≡ trans(trans(plus_one)))(1) 
≡ (λ f0 ⇒ λ x1 ⇒ 2 * f0(2 * x1))(trans(plus_one)))(1) 
≡ (λ x1 ⇒ 2 * trans(plus_one)(2 * x1))(1) 
≡ 2 * trans(plus_one)(2 * 1) 
≡ 2 * (λ f0 ⇒ λ x1 ⇒ 2 * f0(2 * x1))(plus_one)(2 * 1) 
≡ 2 * (λ x1 ⇒ 2 * plus_one(2 * x1))(2 * 1) 
≡ 2 * 2 * plus_one(2 * (2 * 1)) 
≡ 2 * 2 * (λ x0 ⇒ x0 + 1)(2 * (2 * 1)) 
≡ 2 * 2 * ((2 * (2 * 1)) + 1) 
≡ 20 
관련 문제