
On 9/08/2015, at 8:59 am, MigMit
The reason is very simple, and it was stated several times already: it will break everything that was written so far, and there is not enough evidence that things would be even a little better.
Not just everything written IN Haskell, but everything written ABOUT Haskell as well. Like books, lecture notes, tutorials, ... For what it's worth, -- Ada type I1 is new Integer; -- isomorphic but incompatible subtype I2 is Integer; -- just an alias (* ML *) datatype 'a tsil = LIN | SNOC of 'a tsil * 'a type revints = int stil (* spell the words backwards *) // F# type T = A | B | C;; type R = T;; // How's that for confusing? Defining a new type (T) and an // alias (R) use the *same* keyword and operator! type S = S;; // defines a new type with one constructor, but // type S = T;; // would have defined S as an alias for T. % Mercury :- type strange ---> foo(int) ; bar(string). :- type wierd == strange. % different operator. % Erlang -type tsil(T) :: nil | {snoc,tsil(T),T}. -type revints() :: tsil(integer()). % This looks as bad as F#, but it's either better or worse, % depending on your viewpoint. Erlang types are not % Hindley-Milner types and it does not have ADT (sum-of- % products) declarations. 'snoc' above is just a constant. % BOTH declarations are aliases. // Clean ::Tsil a = Lin | Snoc (Tsil a) a ::RevInts :== Tsil Int //different operator "::" is used to *introduce* a type in Clean, presumably because infix "::" is used to *apply* a type (Empty :: RevInts). Haskell is actually pretty clear.