[erlang-questions] Must and May convention

zxq9 <>
Thu Sep 28 16:35:49 CEST 2017


On 2017年09月28日 木曜日 16:14:39 Joe Armstrong wrote:
> >   test2(F) ->
> >       F = parse(tokenize(ok(file:read_file()))).
> 
> My problem with the above is I almost never write like this
> In my head I'm thinking "first you read the file then you tokenize it
> then you parse it"
> 
> So pipes or breaking the code line by line with temporary variables
> is fine by me. Adding temporary variables is also nice because you
> can print them when things go wrong.

I absolutely agree with that. The only time I find heavy composition
readable is when you are casting from one form to another just to get
some utility from a particular representation, like pushing a set or
map into a list and back again.

When we need pipes I prefer to go to full-blown pipeline functions
instead of sugary composition operators. What I nearly always really
need is an assertion at each step, and that is why I am so strongly
in favor of the form:

    foo(Resource) ->
        {ok, Data} = get_stuff(Resource),
        {ok, Scrubbed} = scrub(Data),
        process_important_value(Scrubbed).

If I see instead:

    foo(Resource) ->
        {ok, Data} = get_stuff(Resource),
        Scrubbed = scrub(Data),
        process_important_value(Scrubbed).

I know straight away that scrub/1 is a pure function that crashes on
bad input. This is, of course, assuming the idiom that I laid out before.

-Craig


More information about the erlang-questions mailing list