1
我怎麼能寫在 「咖喱」 語法如下:
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
但是,這似乎並沒有正確評估。
更好的是,Lambda表達式可以看到綁定。
謝謝!
我怎麼能寫在 「咖喱」 語法如下:
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
但是,這似乎並沒有正確評估。
更好的是,Lambda表達式可以看到綁定。
謝謝!
let v = e1 in e2
轉換爲lambda微積分爲(\v.e2)(e1)
(其中我使用反斜槓來表示lambda)。所以,你的例子是
(\y1.(\f1.(\f2.f2 5)(\x2.(\y2.f1(y2))(3)))(\x1.x1+y1))(2)
我用alpha轉換來區分變量,否則會有相同的名稱。注意中間的f
已變成f1
,即f
的f y
在您的示例的第三行中使用了第二行中定義的f
,而不是第三行中將要定義的那個。換句話說,你的定義不是遞歸的;您已使用let
,而不是let rec
。
Digression:將let rec
轉換爲lambda演算需要一個固定點組合器Y
(或一些類似技術)。 Y
的特徵是Y(f)
簡化爲f(Y(f))
。然後,let rec v = e1 in e2
大致轉換爲(\v.e2)(Y(\v.e1))
。
太好了。我熟悉a轉換,但我沒有假設OCaml語法完全相同,並且這些確實是「不同的」y。另外:愛的離題。 – Krpcannon