concrete functor and monad transformers

#69Alternative instance for ContT

instance (Monoid r, Applicative m) => Alternative (ContT r m) where
    empty = ContT $ const (pure mempty)
    (ContT f) <|> (ContT g) = ContT $ \c -> liftA2 (<>) (f c) (g c)

Some ways this can be useful:

  1. You're using ContT to implement a backtracking search. r is Maybe (First Result)) for some Result :: *. a <|> b then means "try a then try b".

  2. You have a function inferType :: Expr a -> (a -> Type) -> Type where Expr a represents an AST containing free variables in a, and (a -> Type) is an environment which maps free variables to their type. Type has a monoid instance where mempty is the type of bottom and (<>) is unification; you form a Cont Type a by way of cont (inferType e). Then (<|>) will lift (<>) from working in the empty environment to working in arbitrary ones.