Copyright (c) Samuel Schlesinger 2020 MIT sgschlesinger@gmail.com experimental POSIX, Windows Safe Haskell2010

Contents

Description

Synopsis

The CommanderT monad is stateful and has the ability to backtrack.

data CommanderT state f a Source #

A CommanderT action is a metaphor for a military commander. At each step, we have a new Action to take, or we could have experienced Defeat, or we can see Victory. While a real life commander worries about moving his troops around in order to achieve a victory in battle, a CommanderT worries about iteratively transforming a state to find some value.

In more practical terms, a term of type CommanderT can be thought of as a backtracking, stateful computation which can either result in a result being produced, or nothing being produced. It is a Monad for any base Functor you want to use as the effect inside of the stateful computation, similarly to the free monad.

Constructors

 Action (state -> f (CommanderT state f a, state)) Defeat Victory a
Instances
 MonadTrans (CommanderT state) Source # Instance detailsDefined in Control.Monad.Commander Methodslift :: Monad m => m a -> CommanderT state m a # Functor f => Monad (CommanderT state f) Source # Instance detailsDefined in Control.Monad.Commander Methods(>>=) :: CommanderT state f a -> (a -> CommanderT state f b) -> CommanderT state f b #(>>) :: CommanderT state f a -> CommanderT state f b -> CommanderT state f b #return :: a -> CommanderT state f a #fail :: String -> CommanderT state f a # Functor f => Functor (CommanderT state f) Source # Instance detailsDefined in Control.Monad.Commander Methodsfmap :: (a -> b) -> CommanderT state f a -> CommanderT state f b #(<\$) :: a -> CommanderT state f b -> CommanderT state f a # Functor f => Applicative (CommanderT state f) Source # Instance detailsDefined in Control.Monad.Commander Methodspure :: a -> CommanderT state f a #(<*>) :: CommanderT state f (a -> b) -> CommanderT state f a -> CommanderT state f b #liftA2 :: (a -> b -> c) -> CommanderT state f a -> CommanderT state f b -> CommanderT state f c #(*>) :: CommanderT state f a -> CommanderT state f b -> CommanderT state f b #(<*) :: CommanderT state f a -> CommanderT state f b -> CommanderT state f a # MonadIO m => MonadIO (CommanderT state m) Source # Instance detailsDefined in Control.Monad.Commander MethodsliftIO :: IO a -> CommanderT state m a # Functor f => Alternative (CommanderT state f) Source # Instance detailsDefined in Control.Monad.Commander Methodsempty :: CommanderT state f a #(<|>) :: CommanderT state f a -> CommanderT state f a -> CommanderT state f a #some :: CommanderT state f a -> CommanderT state f [a] #many :: CommanderT state f a -> CommanderT state f [a] #

runCommanderT :: Monad m => CommanderT state m a -> state -> m (Maybe a) Source #

We can run a CommanderT on some state and see if it has a successful campaign.

hoistToFunctor :: Functor g => (forall a. f a -> g a) -> CommanderT state f a -> CommanderT state g a Source #

We can go from a non-Functor to a Functor inside of a CommanderT action. This does the transformation "top to bottom", as opposed to hoistFromFunctor, which does it "bottom to top". If your natural transformation is lessening, i.e. it trims branching structure, then you probably want to use this function.

hoistFromFunctor :: Functor f => (forall a. f a -> g a) -> CommanderT state f a -> CommanderT state g a Source #

We can go from a Functor to a non-Functor inside of a CommanderT action. This does the transformation "bottom to top", as opposed to hoistToFunctor, which does it "top to bottom". If your natural transformation is increasing, i.e. it adds branching structure, then you probably want to use this function.