0 | module Control.Monad.Free.Church
2 | import Control.Monad.Trans
4 | import Control.Monad.Free
6 | record F (f : Type -> Type) (a : Type) where
8 | runF : forall z. (a -> z) -> (f z -> z) -> z
11 | map f (MkF g) = MkF (\kp => g (kp . f))
13 | Applicative (F f) where
14 | pure x = MkF (\kp, _ => kp x)
15 | MkF f <*> MkF g = MkF (\kp, kf => f (\a => g (kp . a) kf) kf)
18 | MkF m >>= f = MkF (\kp, kf => m (\a => runF (f a) kp kf) kf)
21 | lift f = MkF (\kp, kf => kf (liftM kp f))
22 | where liftM : (a -> b) -> m a -> m b
23 | liftM f m = pure $
f !m
25 | {f : _} -> MonadFree f (F f) where
26 | wrap f = MkF (\kp, kf => kf (map (\(MkF m) => m kp kf) f))