Safe Haskell | None |
---|---|
Language | Haskell2010 |
- data Eff r a
- type Handler e r a b = Comp e r a b -> Res r b
- data Comp e r a b
- type Res r = Free (Union r)
- effect :: (forall b. (a -> Res r b) -> Union r (Res r b)) -> Eff r a
- runPure :: Eff `[]` a -> a
- runPureRes :: Res `[]` a -> a
- handle :: (Functor e, Typeable e) => Handler e r a b -> Eff (e : r) a -> Eff r b
- continue :: Res r a -> Eff r a
- finish :: Eff r a -> Res r a
- inj :: (Typeable f, Functor f, Member f r) => f a -> Union r a
- class Member f r
- class Typeable a
Documentation
type Handler e r a b = Comp e r a b -> Res r b Source
Handler is a function that takes a result or an effect and a continuation |and handles it.
e
is the effect functor you are handling
r
represents the type of the type list of the remaining effects.
Usually you want to be polymorphic in this.
a
is the result type of the program you will handle
b
is the result of handled computation.
Comp represents a computation. It is either a pure value or a computation that needs further evaluation and effect handling.
runPure :: Eff `[]` a -> a Source
A program without effects is guaranteed to be pure so you can safely convert it into a value.
runPureRes :: Res `[]` a -> a Source
Like runPure
but for program results. You only need this for implementing
some handlers.
handle :: (Functor e, Typeable e) => Handler e r a b -> Eff (e : r) a -> Eff r b Source
Use a Handler
on an Eff
program to stripe away the first layer of effects.
There are some issues if you are using a handler that is somewhat polymorphic in e
As the compiler cannot figure out which effect are you handling. Currently the best
solution seems to be to manually specify type of the handler such that it is monomorphic
in e
. Sorry.
continue :: Res r a -> Eff r a Source
Convert a result back into a program in order to compose it.
This function might not be needed and might introduce some
performance issues (it is used in handle
) but we didn't find
a way to drop it.
The Member
type clas denotes that f is a member of type list r