[Haskell-cafe] an idea for modifiyng data/newtype syntax: use `::=` instead of `=`
Richard A. O'Keefe
ok at cs.otago.ac.nz
Tue Aug 18 05:52:55 UTC 2015
On 9/08/2015, at 8:59 am, MigMit <miguelimo38 at yandex.ru> wrote:
>
> 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.
More information about the Haskell-Cafe
mailing list