Haskell's syntax

Paul Hudak paul.hudak@yale.edu
Tue, 22 Apr 2003 10:24:47 -0400


Of these I think that (3) is most serious.  What I do is tell students
that a data type declaration such as:

  data Tree a = Bin (Tree a) a (Tree a) | Nil

is really a kind of shorthand for:

  data Tree a where
    Bin :: Tree a -> a -> Tree a -> Tree a
    Nil :: Tree a

which better separates the worlds of types and terms (and happens to
look like a type class declaration).

Hope this helps,  -Paul   


Arjan van IJzendoorn wrote:
> Hello everyone,
> 
> I teach Haskell to our first-year students and I find that Haskell's syntax
> is confusing to many. Some examples:
> 
> (1) You define data types with vertical bars (|) but in the world of
> expressions vertical bars (i.e. guards) are exactly what you can not use to
> discriminate between constructors.
> 
> (2) Pattern-matching and guards are very often mixed up. Both are used for
> making choices and they overlap somewhat but not completely in expression
> power. For learning a language it would be nice if one construct did it all,
> guards including pattern guards maybe.
> 
> (3) Types and expressions look very much alike. Say we have:
>   data Tree a = Bin (Tree a) a (Tree a) | Nil.
> Around half (!) of the students now write (on a written test):
>   size (Bin (Tree left) x (Tree right)) = ...
> mixing up the two worlds completely.
> 
> Do other teachers have the same experience?
> 
> Regards, Arjan