an erlang monad?

Ulf Wiger <>
Wed Mar 2 21:15:06 CET 2005


Den 2005-03-02 18:25:47 skrev Matthias Kretschmer <>:

> This is something I use monads for, too. Hiding some sort of state or  
> other information (serialization of operation or doing i/o is not that  
> much of a concern using Erlang :-)). I wrote a little parse_transform'er  
> to make the notation easier:
>
> monad(MT,
>   Action0,
>   Action1,
>   1 = mreturn(1),
>   Action2,
>   X = Action3,
>   Action4,
>   Action5(X)).
>
> this would be roughly like (assuming MT.>>= is an infix operation):
>
> Action0 MT.>>= fun (_) ->
> Action1 MT.>>= fun (_) ->
> MT.return(1) MT.>>= fun (1) ->
> Action2 MT.>>= fun (_) ->
> Action3 MT.>>= fun (X) ->
> Action4 MT.>>= fun (_) ->
> Action5(X) end end end end end
>
> trying to resemble basically Haskell's do-notation -- except that  
> instead of "X <- Action" "X = Action" (the MT is the monad type  
> specification -- basically a tuple containing the "bind"/">>=",  
> "return", etc. functions).

Great! Couple this with John Hughes' ?DELAY and ?FORCE macros,
and you've almost got yourself a real language (except for the
lack of static typing, of course)  ;-)


> This way you may even drop the fun (D) -> ... end and just write the
> expressions, using appropriate monad values for reading and writing the
> state (e.g. wrapping the basic dictionary operations).

I played around for a while with macros in order to avoid
having to write fun(D) -> ... end all the time, but eventually
I gave up.

/Uffe



More information about the erlang-questions mailing list