[erlang-questions] The If expression
Henning Diedrich
hd2010@REDACTED
Fri May 28 03:20:40 CEST 2010
I think I found my one-armed-if at long last!
Shame on everybody standing by who knew it all along and chuckled with glee:
Index /= null orelse throw(index_null).
*love it* *beautiful* *ouch* *ey! stop that!*
I am still trying hard to avoid the need for a one armed if as per the
reasons brought up in this thread.
Many times I succeed and the extra effort pays off in a yet better
understanding of the FP ways.
However, whenever the desire is for more informative error messages ---
over 'just let it crash' --- anything else clutters the code and
one-armed ifs *are* the right thing to use there because I don't care
for all the other cases. In such cases I am not interested in what value
may be returned because I will break away anyway.
And better error messages are a legitimate constraint sometimes. I
understand it's not in Erlang's heritage in some way.
Message passing and IO are other areas where side effects are the focus,
not return values. And where therefore one-armed ifs could be a honest
thing.
From all the help, which I want to say *thank you* for, the following
had been the strongest advice that stuck with me in its simplicity and
fair abstraction:
Robert Virding wrote:
> ... however you choose to use 'if', or any other
> construction for that matter, Erlang is a functional language and
> everything returns, and must return, a value.
Thanks, Robert, this reminder helped to get into the right thinking
often times!
> So even if 'if' didn't
> need to have an explicit default or else case then it would still have
> to return a value. We would never be able agree on a default value
> anyway. :-) 'nil' is not a good value here as it has no inherent
> meaning in Erlang as it does in Lisp.
>
It probably held true 80% of the times when I ran into a subjective (<-
qualifier inserted for Rich!) need of a one-armed-if.
But whenever exceptions come into play, the return value argument can
become mute I found, in FP. As suggested by the fact that the result of
the after-body of try-catch-after constructs are discarded as well.
Currently I'd argue that in an analogous way the second arm of 'case' or
'if' is not necessarily-necessary when the only arm that matters is
ending on throw/erlang:error/exit. If I wisen up, I promise I'll retract.
I did find very many occasions where instead of a 'case', the correct
pattern matching in the function head made all the difference, or a
'case' structure could with some deliberation be rewritten to have a
sensical second arm.
But especially when I need to throw an error /from/ a place 'higher up'
in the call stack to put more information with it, I couldn't always
find a sensible way to use the second arm of and 'if' or 'case'. (Re
throwing from higher up: e.g. a list may have been consumed in its
entirety 'lower down' when I realize a dead end is hit. And so I can't
show it in the error message if it's thrown from there. Unless I add a
parameter.)
Thank you again for all your thoughts, they are very much appreciated.
Henning
More information about the erlang-questions
mailing list