Conor McBride wrote:
Hi

Sittampalam, Ganesh wrote:
> Martin Hofmann wrote:
> > It is pretty clear, that the following is not a valid Haskell pattern:
> >
> > foo (x:x:xs) = x:xs
> >
> > My questions is _why_ this is not allowed. IMHO, the semantics should
> > be
> > clear: The pattern is expected to succeed, iff 'x' is each time bound
> > to the same term.

That's what my daddy did in 1970. It was an extension of
LISP with pattern matching. He used EQUAL. That makes me
one of the few functional programmers who's had this
feature taken away from them. I'm not weeping, but I do
miss it.

On the one hand, unification is awesome; on the other hand, pattern matching is simple. The nice thing about the simplicity is that it's easy to compile into efficient code, and it's easy to explain/understand. Unification has all sorts of unfortunate consequences[1] and it's much harder to explain to the uninitiated.

Curry[2] has features like this, but then it has full backtracking-search logic programming. It might be interesting to see if a more restricted form is useful in Haskell, though it should be an optional feature IMO so that it can be disabled for guaranteed-efficient patterns and typo detection.


[1] e.g. optimal factoring of an unordered set of Prolog terms is NP-complete. For a fixed ordering there are good algorithms, and Haskell has fixed ordering due to the semantics of overlapping patterns, but this should still give some clues about what lurks beneath.

[2] http://www.curry-language.org/


> How do you define the "same term"?
>
> One natural way of compiling it would be to
>
> foo (x:y:xs) | x == y = x:xs
>
> but then pattern matching can introduce Eq constraints which some might
> see as a bit odd.

Doesn't seem that odd to me. Plenty of other language features
come with constraints attached.

Another option is to use structural matching all the way down. This has the benefit of not calling user-defined code, though it has the disadvantages of not matching heterogeneous but semantically-equal values. Of course, by removing the Eq constraint this also re-raises the specter of comparing functions. But it's a good Devil's Advocate definition to bear in mind.

--
Live well,
~wren
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to