[Haskell-cafe] Prolog-style list syntax?

Viktor Dukhovni ietf-dane at dukhovni.org
Mon Jun 28 17:02:53 UTC 2021

On Mon, Jun 28, 2021 at 06:17:42PM +1200, Anthony Clayden wrote:

> One of the annoying (to me) inconsistencies with Haskell syntax is
> that `[]` means 'here comes a list'; but for the most common way to
> write a list, you can't use `[]`:
> >    elem x []        = False
> >    elem x ( y : ys ) = ...

Yes, there's presently no way to pattern-match a list tail inside `[]`.

> Unfortunately ...
> >    elem x [ y: ys ] = ...
> Is valid syntax, where `:` is cons, so this is a nested list. I'm thinking
> that's relatively uncommon, and means the same as `[ ( y: ys ) ]`.
> Would anyone be violently pro or anti changing the meaning of `:` appearing
> at top level in `[   ]` to mean cons-tail?

I'm on the violently against side on the question of `[x : ys]` being
reinterpreted as `(x : ys)`.  For any expression `e1, we have a
singleton `[e]`, and there should not be any surprising exceptions to
that rule.

If something new is to pattern match as `x : ys` inside `[]` it would
have to be invalid syntax presently.  So it could in principle be:


but I'm concerned that this is too likely to be an inadvertent typo,
as in:

    [ x,
    , y ]

It is probably more useful to catch this sort of error, than to overload
the syntax for head + tail pattern matches.

So on the whole, I'm inclined to accept the status quo.  The annoyance,
if any, of having to use `(x : ys)` in pattern matches would not be
solved by adding a third syntax for lists.


More information about the Haskell-Cafe mailing list