<div dir="ltr">Funnily, i've just noticed that this notation with `::=` to define data types is used in [Why Functional Programming Matters by John Hughes](http://www.cse.chalmers.se/~rjmh/Papers/whyfp.html).<div><br></div><div>Just a remark.<br><div><br></div><div>Alexey.<br><br>On Saturday, August 8, 2015 at 1:09:24 PM UTC+2, Alexey Muranov wrote:<blockquote class="gmail_quote" style="margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">Hello,
<br>
<br>i would like to suggest an idea for modifying the basic data/newtype syntax in Haskell: replace the equality sign `=` with `::=`.
<br>
<br>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.
<br>
<br>For example, in
<br>
<br>    type Name = String
<br>    data Date = Date Int Int Int
<br>    data Anniversary = Birthday Name Date | Wedding Name Name Date
<br>
<br>the second line is particularly disorienting IMO because on two sides of the equality, `Date` denotes different things.
<br>
<br>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
<br>
<br>    foo x y = bar y x
<br>
<br>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
<br>
<br>    type Name = String
<br>
<br>is present, `Name` can be used as `String`.  Clearly, the equality in
<br>
<br>    data Date = Date Int Int Int
<br>
<br>does not have such property.
<br>
<br>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
<br>
<br>    type Name = String
<br>    data Date ::= Date Int Int Int
<br>    data Anniversary ::= Birthday Name Date | Wedding Name Name Date
<br>
<br>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
<br>
<br>    Name = String
<br>    Date ::= Date Int Int Int
<br>    Anniversary ::= Birthday Name Date | Wedding Name Name Date
<br>
<br>What do you think?
<br>
<br>Alexey.
<br>______________________________<wbr>_________________
<br>Haskell-Cafe mailing list
<br><a href="mailto:Haskell-Cafe@haskell.org" target="_blank" rel="nofollow" onmousedown="this.href='mailto:Haskell-Cafe@haskell.org';return true;" onclick="this.href='mailto:Haskell-Cafe@haskell.org';return true;">Haskell-Cafe@haskell.org</a>
<br><a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" target="_blank" rel="nofollow" onmousedown="this.href='http://www.google.com/url?q\75http%3A%2F%2Fmail.haskell.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fhaskell-cafe\46sa\75D\46sntz\0751\46usg\75AFQjCNH7sFgl7KfuDcDlaGGG3ip3kRaoIA';return true;" onclick="this.href='http://www.google.com/url?q\75http%3A%2F%2Fmail.haskell.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fhaskell-cafe\46sa\75D\46sntz\0751\46usg\75AFQjCNH7sFgl7KfuDcDlaGGG3ip3kRaoIA';return true;">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/haskell-<wbr>cafe</a>
<br></blockquote></div></div></div>