[erlang-questions] Must and May convention

Richard A. O'Keefe <>
Fri Sep 29 04:45:01 CEST 2017

On 29/09/17 4:33 AM, Fred Hebert wrote:

> As an example, Elixir has added the 'With' syntax:
>    opts = %{width: 10, height: 15}
>    with {:ok, width} <- Map.fetch(opts, :width),
>         {:ok, height} <- Map.fetch(opts, :height),
>      do: {:ok, width * height}

How is this different from 'let'?

There was a very old proposal for Erlang that
variables introduced between 'begin' ... 'end'
brackets should be local, so that this would be
         {ok,Width}  = map:fetch(Opts, width),
         {ok,Height} = map:fetch(Opts, height),
         {ok, Width*Height}
If memory serves me, this was proposed about 25 years
ago, at about the same time that 'cond' was.

> This is now some kind of new fancy syntax. However, Erlang lets you do
> something similar to with with list comprehensions:
>    Opts = dict:from_list([{width,10}, {heigth,15}]),
>    hd([{ok, Width*Height}
>        || {ok, Width} <- [dict:find(width, Opts)],
>           {ok, Height} <- [dict:find(height, Opts)]])

Or with
     (fun ({ok,Width}, {ok,Height}) -> {ok,Width*Height} end
     )(map:fetch(Opts, width), map:fetch(Opts, height))

More information about the erlang-questions mailing list