type OpenRec x y = (x -> y) -> x -> y
fact :: OpenRec Int Int
fact x n = if n == 0 then 1 else n * x(n - 1)
newtype Mu a = Mu (Mu a -> a)
y :: OpenRec x y -> x -> y
y f = (\h -> h $ Mu h) (\x -> f . (\(Mu g) -> g) x $ x)
main = do
print $ fact(fact(fact(undefined)))(2)
print $ y(fact)(10)