On 2/18/15 5:29 PM, Mike Meyer wrote:
I don't understand. I don't believe I said anything about avoiding
else-if, or about not avoiding it. But I'm not quite sure what you
mean. Are you referring to
if condition1
then instruction1
elseif condition2
then instruction2
?
But what is condition1? Wouldn't it probably be the base case, and
instruction1 the procedure on the base case?
Is there something special about "elseif" that guarantees that
instruction1 *before* it won't crash if condition1 isn't the base
case??? I'm probably totally missing your intention here.
But anyway, isn't it actually just Haskell's syntax "x:xs" that lets
the pattern be tested and bypassed without crashing on an empty
list, so that it *can* fall through to the base case at the end? If
Haskell only had the syntax "(head xs), then that *would* crash on
the empty list if the empty list had not previously been taken care
of as a base case, as Joel Neely pointed out.
I didn't mean that *no* other language might have such a syntactical
construction. (I didn't mean "specifically Haskell", I meant
"specifically the pattern matching". Sorry about the ambiguity.)
So if some other language has such a construction, then it's still
the *syntax* that lets you cheat on the base case; it's not the
structure of the problem itself nor the basic underlying notion of
recursion.
I would also argue that in Mr Neely's first example, while the
*explicit* base case [] is at the end, nevertheless the first line
still *implicitly* refers to the base case: pattern matching on
"x:xs" says "*if* the data has the structure x:xs", i.e. "if it is
not a bunch of other stuff ... including *not the empty list*!)".
Certainly you couldn't merely do the recursive step first without a
condition like this particular one. The reason this syntax *seems*
to let you avoid thinking about the base case first is because
secretly it says "only try this step if we're not looking at the
base case"!
I was a math major, not a CS major, so I'm also prejudiced in favor
of base case first. And, as stated above, I think we *are* actually
*considering* the base case first! (We're merely putting off
telling what to *do* with that base case.) I think that the
"syntactic sugar" of some languages obscures (intentionally, for
purposes of convenience) what's really happening mathematically.