[Haskell-beginners] tower hanoi problem

Dudley Brooks dbrooks at runforyourlife.org
Thu Feb 19 09:02:43 UTC 2015


On 2/18/15 5:29 PM, Mike Meyer wrote:
> On Wed, Feb 18, 2015 at 7:16 PM, Dudley Brooks 
> <dbrooks at runforyourlife.org <mailto:dbrooks at runforyourlife.org>> wrote:
>
>     Hmm.  Well, I'd say that that's a feature of, specifically,
>     Haskell's pattern-matching strategy and list-description syntax,
>     rather than of recursion in general or the structure of this
>     particular problem. In other languages with recursion you might
>     have no choice except to start with the base case, even for this
>     problem, or else you'd get the same kind of error you mention
>     below (depending on the language).  I think it's good when you're
>     *learning* recursion to always start with the base case(s).
>
> I disagree that this is a Haskell-specific feature. Any else-if like 
> structure will have this property, no matter what language it's in. 
> That Haskell provides a syntax as part of the function declaration is 
> special, but that doesn't let you avoid the else-if construct when the 
> problem requires it.
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"!
> It may be my fondness for proof by induction, but I think doing the 
> base case first is a good idea for another reason. The code for the 
> recursive cases assumes that you can correctly handle all the 
> "smaller" cases. If that's wrong because some assumption about the 
> base case turns out to be false when you actually write it, then you 
> have to rewrite the recursive cases for the correct base case. So it's 
> better to make sure your base case is going to work before you start 
> writing the code that's going to use it.
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.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/beginners/attachments/20150219/452ab344/attachment.html>


More information about the Beginners mailing list