
2009/5/9 aditya siram
Cool, that's really interesting! So is it accurate to say "predicated" datatypes [1] such as Int and String are provided by Haskell but you cannot create them or specialize on a subset of them? And there are really only two types of datatypes, tags [2] and the "predicated" types. Compound datatypes are just a combination of the two.
-deech
[1] By predicated I mean a datatype that would actually cause a compiler error ( not a runtime error ) if a method returned an out-of-bounds value. [2] By tags I mean the data constructors, but I find it easier to think of them as tags because they can appear alone, eg. data Coins = Penny | Nickel | Dime | Quarter where nothing is being constructed.
I don't see where the "predicated datatype" differs from the tags type : Int could as well be implemented as a "data Int = 0 | 1 | 2 |..." (sparing consideration about characters authorized in a tag), String isn't primitive at all, in fact it's just a list of characters.... You can easily create them. To specialize on a subset of them is very easy too, you can use newtype or data and create a smart constructor, as well as appropriate instances. The only problem is that it is pretty hard to get compile time guarantee on some of them but no other classic language provides more guarantee : the only languages that can do better are those that have dependant types (Agda, Coq, Epigram...) and as you'll know if you tried them they're frequently harder to use than Haskell. NB : You can use Template Haskell to get some compile-time errors for the constants of your code. -- Jedaï