
Hi Alexey,
this is indeed a confusion point for many newcomers, including me.
In Haskell we are being told that the equality sign really means equality
as in "interchangeable", as opposed to "assignment of value" in many other
languages.
So what about the equal sign in data definition? Plus types and type
constructors often have the same name without being the same thing, this
adds to the confusion.
So I really like your suggestion.
However as said Oliver this breaks all existing Haskell code.
One thing I quite don't understand is: do we really need to make the
newtype/data distinction explicit?
If we used only one keyword, it should be quite easy for the compiler to
detect the distinction statically.
On Sat, Aug 8, 2015 at 1:09 PM, Alexey Muranov
Hello,
i would like to suggest an idea for modifying the basic data/newtype syntax in Haskell: replace the equality sign `=` with `::=`.
When i started learning Haskell, the most confusing part of the syntax for me was the equality sign in `data` definition. I could not even guess what the `data` definition meant without reading a chapter or two about types in Haskell, and i think it was partially due to the equality sign. I still find this notation inconsistent with other uses of the equality sign in Haskell and in general.
For example, in
type Name = String data Date = Date Int Int Int data Anniversary = Birthday Name Date | Wedding Name Name Date
the second line is particularly disorienting IMO because on two sides of the equality, `Date` denotes different things.
As far as i understand, in all contexts except those of `data` and `newtype` definitions, the equality sign in Haskell denotes the actual equality for all purposes: if a line
foo x y = bar y x
is present in a program, `foo a b` and `bar b a` can be used more or less interchangeably elsewhere in the program. Similarly, if the line
type Name = String
is present, `Name` can be used as `String`. Clearly, the equality in
data Date = Date Int Int Int
does not have such property.
I think that if `::=` was used instead of `=` in `data` and `newtype` definitions, this would suggest to a newcomer that the syntax of the two sides might be different, and would helpfully remind of the Backus–Naur Form for syntax rules. I think that a newcomer to Haskell, like myself, would have had a better chance of guessing the meaning of
type Name = String data Date ::= Date Int Int Int data Anniversary ::= Birthday Name Date | Wedding Name Name Date
IMO this would make the program easier to read in general and the difference between `type` and `newtype` more clear. Maybe the can even make the use of keywords redundant, by allowing to write simply
Name = String Date ::= Date Int Int Int Anniversary ::= Birthday Name Date | Wedding Name Name Date
What do you think?
Alexey. _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe