On Dec 30, 2007 9:24 AM, Joost Behrends <
webmaster@h-labahn.de> wrote:
A similar point: The tutorials teach, that "=" has a similar meaning than "=" in
mathematics. But there is a big difference: it is not reflexive. The
the right side is the definition of the left. Thus "x=y" has still some kind of
temporality, which mathematics doesn't have. Wadler himself describes bunches
of lazily computed equations as "dataflows" somewhere.
The "=" in the data declaration syntax is different from the "=" in value and type declarations.
type A = B
means that "A" can be used wherever "B" can be used.
data A = B
means that "B" constructs a value of type "A". The "=" acts more like the "::=" in a BNF grammar. It is *not* a claim that A equals B, since A is a type and B is a data constructor. Furthermore, types and data constructors have disjoint namespaces, hence the common idiom of using the same name for the type and the constructor when the type has only one constructor.
There is an alternative syntax for data declarations in recent versions of GHC. Using it, you would write:
data A where
B :: A
This defines a type A, and a constructor B which has type A.
data ClockTime where
TOD :: Integer -> Integer -> ClockTime
This defines a type ClockTime, and a constructor TOD which takes two Integers and constructs a ClockTime.
data Pair :: * -> * -> * where
Pair :: a -> b -> Pair a b
This defines a type constructor Pair, which takes two types and constructs a new type, and a constructor, also called Pair, which, for arbitrary types a and b, takes a value of type a and a value of type b and constructs a value of type Pair a b.