不動点コンビネータ

Y M = M (Y M)

を満たすλ式の時、

Y = λf·(λx·f (x x)) (λx·f (x x))

と定義される(Yコンビネータ)。この時、Haskellでは以下のように表現できる。

fix :: (a -> a) -> a
fix f = f (fix f)

Control.Monad.Fixに同じものがある。

ghci> :module Control.Monad.Fix
ghci> :type fix
fix :: (a -> a) -> a

fixを使ってみる。再帰が用いられた関数。

fib _ 0 = 0
fib _ 1 = 1
fib fact n = n + fact (n -1)

fixに渡す。

ghci> fix fib 4
10
Written on January 26, 2011