Hi Gregg,
Firsly: I'm not an expert on this, so if anyone thinks I'm writing
nonsense, do correct me.
There are many answers to the question "what is a type?", depending on
one's view.
One that has been helpful to me when learning Haskell is "a type is a
set of values." When seen like this it makes sense to write:
() = { () }
Bool = { True, False }
Maybe Bool = { Nothing, Just True, Just False }
Recursive data types have an infinite number of values. Almost all types
belong to this group. Here's one of the simplest examples:
data Peano = Zero | Suc Peano
There's nothing wrong with a set with an infinite number of members.
Gregg Reynolds wrote:
This gives a very interesting way of looking at Haskell type
constructors: a value of (say) Tcon Int is anything that satisfies
"isA Tcon Int". The tokens/values of Tcon Int may or may not
constitute a set, but even if they, we have no way of describing the
set's extension.
Int has 2^32 values, just like in Java. You can verify this in GHCi:
Prelude> (minBound, maxBound) :: (Int, Int)
(-2147483648,2147483647)
Integer, on the other hand, represents arbitrarily big integers and
therefore has an infinite number of elements.
To my naive mind this sounds
suspiciously like the set of all sets, so it's too big to be a set.
Here you're probably thinking about the distinction between countable
and uncountable sets. See also:
http://en.wikipedia.org/wiki/Countable_set
Haskell has types which have uncountably many values. They are all
functions of the form A -> B, where A is an infinite type (either
countably or uncountably).
If a set is countable, you can enumerate the set in such a way that you
will reach each member eventually. For Haskell this means that if a type
"a" has a countable number of values, you can define a list :: [a] that
will contain all of them.
I hope this helps! Let us know if you have any other questions.
Martijn.
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe