an erlang monad?

Matthias Kretschmer <>
Wed Mar 2 18:25:47 CET 2005

On Wed, 2 Mar 2005 16:28:39 +0100
"Ulf Wiger \(AL/EAB\)" <> wrote:

> I have had reason to do some rather complex code using
> a 'dict' dictionary. I find myself constantly wishing
> for a library function (and eventually writing it 
> myself) that does the following:
> with(Dict, Actions) ->
>     lists:foldl(fun(F,D) ->
>                         F(D)
>                 end, Dict, Actions).
> That is, fold over a list of functions that update
> the dictionary. This, I believe, essentially amounts
> to a monad in other languages. ;-) Even if this is 
> just me misunderstanding monads (like everyone else),
> I find the function very useful.

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:

  1 = mreturn(1),
  X = Action3,

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).

Your with/2 function may be easily translated to this notation. I like this notation, because it may be easily used for other types of monads, too, not only the basic state carrying monad and it is possible to build a set of basic combinators that may be used with any monad type. Like backtracking parsers or other stuff.

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 think a really nice do-notation or something like that would be very nice to have in Erlang. I am always missing it (though I am currently quited happy with my transformation-hack).

Matthias Kretschmer

More information about the erlang-questions mailing list