The immutable nature helps with 1) reasoning locally (you can always understand exactly what happens in a function by reading the function itself) and 2) debugging. Additionally, dialyzer provides a very nice (optional) typing system for erlang / Elixir.
And with the new deprecation in 1.4 of bare words, a disambiguation goes away where when looking at a function you sometimes had to go "is this a variable or a function". Now functions with 0 args have parens, always.
I've found the locality of everything in the function that you mentioned helps IMMENSELY in refactoring. Just give a function a namespace and call it, and then figure out where it actually belongs later as you figure out your implementation.