How did the syntax end up with two different tokens---"=>" for separating a pattern from its action in a match rule, and "->" for separating the arg list and the return type in a function definition?
I'm guessing it makes some sense to make them different, because -> will point at a type, while => will point at an expression.
Thanks!
This question could be construed as implying a criticism, since one token (either one) would have been enough (I think), and instead one has to remember which is which. But this is pretty minor. I am curious as to how it got to be this way, because it might reveal aspects of design history, process, and priorities.
->
in function types comes from math notation https://en.wikipedia.org/wiki/Function_space, and is pretty common from other functional languages https://en.wikipedia.org/wiki/Function_type#Programming_languages.
=>
is also used in SML (which uses case
for matching). It's helpful for it to be a different token in case we ever get something where patterns end in a type, to avoid a x: fn(A)->B
ambiguity. (Is that x a fn(A)
that results in the const B
, or a function that returns the type B
?)
Thanks! I didn't think of patterns ending with a type.