[Haskell-cafe] Yet Another Forkable Class

Nicolas Trangez nicolas at incubaid.com
Fri Aug 23 14:29:37 CEST 2013


On Fri, 2013-08-23 at 08:06 +0000, oleg at okmij.org wrote:
> > It will
> > arbitrarily pick the first match in the former and fail to compile
> in
> > the latter case.
> Of course we can have duplicate layers. In that case, the dynamically
> closest
> handler wins -- which sounds about right (think of reset in delimited
> control).

Did anyone ever consider using type-level literals (strings) to 'name'
effects (or transformer layers when using monad stacks)?

A stupid example (OTOH) could be

    updateStats :: (Member (State "min" Int) r, Member (State "max" Int)
r) => Int -> Eff r ()
    updateStats i = do
        min <- askMin
        max <- askMax
        when (i < min) $ putMin i
        when (i > max) $ putMax i
      where
        askMin :: Member (State "min" Int) r => Eff r Int
        askMin = ask
        putMax :: Member (State "max" Int) r => Int -> Eff r ()
        putMax = put
        -- askMax, putMin accordingly

Using constraint synonyms/ConstraintKinds (e.g. type StateMax r = Member
(State "max" Int) r) might reduce some notation overhead.

Just a thought.

Nicolas





More information about the Haskell-Cafe mailing list