G'day all.
Quoting David Menendez <dave at zednenem.com>:
> data A = B
>> means that "B" constructs a value of type "A". The "=" acts more like the
> "::=" in a BNF grammar.
And, indeed, that was the syntax for it in Miranda.
> It is *not* a claim that A equals B, since A is a
> type and B is a data constructor.
Wrong. It _is_ a claim that A equals B. Or, rather, that the set of
values[*] A is defined as the least-fixpoint solution of the equation
A = B.
Think of this:
data IntList = Nil | Cons Int IntList
This corresponds to an equation:
IntList = { Nil } + { Cons } * Int * IntLIst
where plus denotes union (or disjoint union; either works in this
case) and star denotes Cartesian product.
The least fixpoint of this equation is precisely the set of values[*]
in IntList.
> 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.
I think that's the major source of the confusion here, yes.
Cheers,
Andrew Bromage
[*] Theoretical nit: It's not technically a "set".
Consider the data type:
data Foo = Foo (Foo -> Bool)
This declaration states that there's a bijection between the elements of
Foo and the elements of 2^Foo, which by Cantor's diagonal theorem cannot
be true for any set. That's because we only allow computable functions,
and Foo -> Bool is actually an exponential object in the category Hask.