
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: [x,,ys] 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. -- Viktor.