
Hi, Patrick, the namespaces for types and constructors are considered disjoint, i.e. you can use a name in both contexts. A simple example of this feature is your last definition
data Bar = Bar Int
or even shorter
data A = A
This is particularly useful for single-constructor types à la
data MyType a = MyType a
Clearly, using "Int" or "Float" as constructor names may seem odd, but when dealing with a simple grammar it is quite natural to write
data Exp = Num Int | Add Exp Exp
although "Num" is a type class in Haskell. Best regards, Nikita On 27/06/13 17:24, Patrick Redmond wrote:
Hey Haskellers,
I noticed that ghci lets me do this:
data Foo = Int Int | Float :t Int Int :: Int -> Foo :t Float Float :: Foo :t Int 4 Int 4 :: Foo
It's confusing to have type constructors that use names of existing types. It's not intuitive that the name "Int" could refer to two different things, which brings me to:
data Bar = Bar Int :t Bar Bar :: Int -> Bar
Yay? I can have a simple type with one constructor named the same as the type.
Why is this allowed? Is it useful somehow?
--Patrick
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners