난은 "카레"구문에 다음과 같은 기록 할 수 방법 :
(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
그러나 이것은 제대로 평가되지 않는 것 같습니다.
바인딩을 보려면 더 나은 아직 람다 표현 될 것입니다.
감사합니다!
난은 "카레"구문에 다음과 같은 기록 할 수 방법 :
(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
그러나 이것은 제대로 평가되지 않는 것 같습니다.
바인딩을 보려면 더 나은 아직 람다 표현 될 것입니다.
감사합니다!
let v = e1 in e2
은 람다 계산법을 (\v.e2)(e1)
(여기서 람다를 나타 내기 위해 백 슬래시를 사용함)로 변환합니다. 그럼, 당신의 예가 될
(\y1.(\f1.(\f2.f2 5)(\x2.(\y2.f1(y2))(3)))(\x1.x1+y1))(2)
나는 달리 그렇지 않으면 같은 이름을 가지고 변수를 구별하기 위해 알파 변환을 사용했습니다. 중간에있는 f
은 f1
이되고, 예제의 세 번째 줄에 f y
에있는 f
은 f
을 사용하고 두 번째 줄에는 정의 된 세 번째 줄에 정의 할 부분이 아니라는 것을 확인하십시오. 즉, 정의가 재귀가 아닙니다. 당신은 let
이 아니라 let rec
을 사용했습니다.
어림셈 : let rec
을 람다 미적분으로 변환하려면 고정 소수점 결합 자 Y
(또는 이와 유사한 기술)이 필요합니다. Y
은 Y(f)
이 f(Y(f))
으로 감소하는 특성을 특징으로한다. 그런 다음 let rec v = e1 in e2
은 대략 (\v.e2)(Y(\v.e1))
으로 변환됩니다.
멋진. 나는 변환에 익숙하지만 OCaml 문법이 정확히 동일하고 그 문법이 실제로 "다른"것 같다고 생각하지 않았습니다. 또한 : 우울증을 사랑해. – Krpcannon