[Haskell-cafe] manage effects in a DSL

Corentin Dupont corentin.dupont at gmail.com
Tue Jan 28 14:29:27 UTC 2014


Hi Jacques,
I thought about that, but I wasn't able to push it further.
It would look like that:

> data Effect = Effect

> data Exp e a where
>   ReadAccount  :: Exp () Int
>   WriteAccount :: Exp () Int -> Exp Effect ()
>   SetVictory   :: Exp () Bool -> Exp Effect ()
>   OnTimer      :: Exp Effect () -> Exp Effect ()

Is that right? Should Exp () and Exp Effect belong to two different monads?
I was thinking of monad transformers to bridge between the two...


On Tue, Jan 28, 2014 at 1:29 PM, Jacques Carette <carette at mcmaster.ca>wrote:

>  The simplest way would be to add a phantom type parameter to Exp, i.e.
> data Exp e a where
>
> The 'e' variable would be used to track (and propagate) effects.  It is
> then up to you to design your 'effect system' as you wish.
>
> Jacques
>
>
> On 2014-01-28 6:03 AM, Corentin Dupont wrote:
>
>   -> In short, my question is: how can I semantically separate
> instructions with effect from the others? i.e. how can I mark down and
> track those effects?
>
>
>   This is the DSL:
>
> > data Exp a where
> >   ReadAccount  :: Exp Int
> >   WriteAccount :: Exp Int -> Exp ()
> >   SetVictory   :: Exp Bool -> Exp ()
> >   OnTimer      :: Exp () -> Exp ()
> >   Return       :: a -> Exp a
> >   Bind         :: Exp a -> (a -> Exp b) -> Exp b
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20140128/868ce7a0/attachment.html>


More information about the Haskell-Cafe mailing list