2017-03-25 7 views
1

모든 :중첩 "하자"OCaml의 표현식

난은 "카레"구문에 다음과 같은 기록 할 수 방법 :

(y -> (f -> ((f x -> f 5) (y -> f y) 3)) x + y) 2 
: 내가 처음이 같은 시도

let y = 2 in 
let f x = x + y in 
let f x = let y = 3 in f y in 
f 5 

그러나 이것은 제대로 평가되지 않는 것 같습니다.

바인딩을 보려면 더 나은 아직 람다 표현 될 것입니다.

감사합니다!

답변

1

let v = e1 in e2은 람다 계산법을 (\v.e2)(e1) (여기서 람다를 나타 내기 위해 백 슬래시를 사용함)로 변환합니다. 그럼, 당신의 예가 될

(\y1.(\f1.(\f2.f2 5)(\x2.(\y2.f1(y2))(3)))(\x1.x1+y1))(2) 

나는 달리 그렇지 않으면 같은 이름을 가지고 변수를 구별하기 위해 알파 변환을 사용했습니다. 중간에있는 ff1이되고, 예제의 세 번째 줄에 f y에있는 ff을 사용하고 두 번째 줄에는 정의 된 세 번째 줄에 정의 할 부분이 아니라는 것을 확인하십시오. 즉, 정의가 재귀가 아닙니다. 당신은 let이 아니라 let rec을 사용했습니다.

어림셈 : let rec을 람다 미적분으로 변환하려면 고정 소수점 결합 자 Y (또는 이와 유사한 기술)이 필요합니다. YY(f)f(Y(f))으로 감소하는 특성을 특징으로한다. 그런 다음 let rec v = e1 in e2은 대략 (\v.e2)(Y(\v.e1))으로 변환됩니다.

+0

멋진. 나는 변환에 익숙하지만 OCaml 문법이 정확히 동일하고 그 문법이 실제로 "다른"것 같다고 생각하지 않았습니다. 또한 : 우울증을 사랑해. – Krpcannon