FIXME:説明追加&リンク追加
ラムダ式で書くと
λf.(λx.f(xx))(λx.f(xx))
ただしこれでは(xx)に型が付かない。
-- 不動点演算子 Y y :: a -> a -> a y f = f (y f) -- yの使用例 再帰関数 fact を 高階関数 fac の不動点として定義する fact = let fac f = ?x -> if x == 0 then 1 else x * f (x-1) in y fac
-- 不動点演算子 # let rec y f = f (lazy (y f)) val y : ('a lazy_t -> 'a) -> 'a = <fun> -- yの使用例 # let fac f = function 0 -> 1 | x -> x * (Lazy.force f) (x - 1) # let fact = y fac -- こっちが普通かな...? # let y f x = f (y f) x