HaskellでYCombinatorを書くことは可能ですか?
無限再帰型のようです。
Y :: f -> b -> c
where f :: (f -> b -> c)
か何か。単純なわずかに因数分解された階乗でさえ
factMaker _ 0 = 1
factMaker fn n = n * ((fn fn) (n -1)
{- to be called as
(factMaker factMaker) 5
-}
「発生チェック:無限型を構築できません:t = t->t2->t1」で失敗します
(Yコンビネータは次のようになります
(define Y
(lambda (X)
((lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg))))
(lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg)))))))
スキームで)または、より簡潔に
(λ (f) ((λ (x) (f (λ (a) ((x x) a))))
(λ (x) (f (λ (a) ((x x) a))))))
応募注文についてそして
(λ (f) ((λ (x) (f (x x)))
(λ (x) (f (x x)))))
これは、怠惰なバージョンのイータ収縮です。
短い変数名を好む場合。