Summary: Haskell uses :: as the type operator. That was a mistake that costs us over 1 million characters of source code.
Haskell uses ::
for type annotations, e.g. (1 :: Int)
. Most other FP languages with types use :
, including Scala, OCaml, Agda, Idris and Elm. Haskell uses :
for list cons, so you can write:
myList = 1:2:[] :: [Int]
Whereas in other languages you write:
myList = 1::2::[] : [Int]
Moreover, the reason Haskell preferred ::
was the belief that if the cons operator was ::
then people would quite naturally insert spaces around it, giving:
myList = 1 :: 2 :: [] : [Int]
The final program is now noticeably longer than the original. Back when people first invented Haskell, I imagine they were mainly list manipulation operations, whereas now plenty of libraries work mainly at the type level. That raises the question - would Hackage be shorter or longer if we used :
for types?
Method
I downloaded the latest version of every Hackage package. For each .hs
file, I excluded comments and strings, then counted the number of instances of :
and ::
, also noting whether there were spaces around the :
. The code I used can be found here.
Results
- Instances of
::
= 1,991,631 - Instances of
:
= 265,880 (of which 79,109 were surrounded by two spaces, and 26,931 had one space)
Discussion
Assuming we didn't add/remove any spaces, switching the symbols would have saved 1,725,751 characters. If we assume that everyone would have written ::
with spaces, that saving drops to 137,9140 characters. These numbers are fairly small, representing about 0.17% of the total 993,793,866 characters on Hackage.
Conclusion
The Haskell creators were wrong in their assumptions - type should have been :
.
Update: the first version of this post had numbers that were too low due to a few bugs, now fixed.
Thank you for this empirical confirmation of my long-held belief. I only regret that in posting now, you may have missed the chance for a 1 April Haskell Prime proposal.
ReplyDeleteDaniel: This feature is so great that I'm not sure we can wait til 1st April for the proposal.
ReplyDeleteI put this post in my Hall of Fame of parodies.
ReplyDeleteEspecially liked the "0.17%" note ;-).
...and has been duly noted at https://wiki.haskell.org/Nitpicks.
ReplyDeleteto Mr David Turner;
Could you please enlighten the rest of us, and future generations, as to why you used a single colon for the cons data constructor in Miranda(R) (along with - IIRC - SASL and KRC)?
I'm assuming that choice was one crucial factor in Haskell now having the same syntax.
Thank you.
Thank you foor writing this
ReplyDelete