import Html exposing (text)
type Mu a b = Roll (Mu a b -> a -> b)
unroll : Mu a b -> (Mu a b -> a -> b)
unroll (Roll x) = x
fix : ((a -> b) -> (a -> b)) -> (a -> b)
fix f = let g r = f (\v -> unroll r r v)
in g (Roll g)
fac : Int -> Int
fac = fix <|
\f n -> if n <= 0
then 1
else n * f (n - 1)
main = text <| toString <| fac 5