"Do" notation in Elixir and Haskell

do-notation, elixir

Solution

Yes and no. `do`/`end` is a syntactic convenience for keyword lists.

You have probably written if expressions before. What someone may expect to see is something like

if predicate do
  true_branch
else
  false_branch
end

This can also be written using keyword lists. The following is the exact same.

if predicate, do: true_branch, else: false_branch

Using the `do`/`end` notation allows us to remove verbosity when writing blocks of code. The following two if expressions are equivelent

if predicate do
  a = foo()
  bar(a)
end

if predicate, do: (
  a = foo()
  bar(a)
)

This is the same for defining functions. the `def/2` macro uses a keyword list as well. Meaning you can define a function like the following

def foo, do: 5

You can read more about this in the getting started guide.

Problem

I have been using "do/end" notation in elixir more-or-less like imperative block delimiters. (In other words, `do` is like `{` in a C-like language, `end` is like `}`). Is this an accurate description of what's going on? Or is it more like the Haskell `do` notation, which constructs syntactic sugar for a monad that allows for imperative-like coding?

Original source