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:
You're using
ContTto implement a backtracking search.risMaybe (First Result))for someResult :: *.a <|> bthen means "tryathen tryb".You have a function
inferType :: Expr a -> (a -> Type) -> TypewhereExpr arepresents an AST containing free variables ina, and(a -> Type)is an environment which maps free variables to their type.Typehas a monoid instance wherememptyis the type of bottom and(<>)is unification; you form aCont Type aby way ofcont (inferType e). Then(<|>)will lift(<>)from working in the empty environment to working in arbitrary ones.