私は関数型プログラミングのスキームに本当に慣れていません。最近、ラムダ計算で Y コンビネーター関数に出くわしました。このようなものY ≡ (λy.(λx.y(xx))(λx.y(xx)))
です。スキームで実装したかったので、たくさん検索しましたが、上記の構造と完全に一致する実装は見つかりませんでした。私が見つけたそれらのいくつかを以下に示します。
(define Y
(lambda (X)
((lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg))))
(lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg)))))))
と
(define Y
(lambda (r)
((lambda (f) (f f))
(lambda (y)
(r (lambda (x) ((y y) x)))))))
ご覧のとおり、これらはこのY ≡ (λy.(λx.y(xx))(λx.y(xx)))
コンビネーター関数の構造と一致しません。まったく同じ方法でスキームに実装するにはどうすればよいですか?