[Haskell-beginners] creating a relational tuple type

AM agentm at themactionfaction.com
Mon Oct 17 21:51:07 CEST 2011


Hello,

As an effort to learn Haskell, I am creating a relational algebra engine. To this end, I have been looking at how haskelldb handles its mapping layer. I found this:

data RecNil = RecNil deriving (Eq, Ord)
data RecCons f a b = RecCons a b deriving (Eq, Ord)

It seems to me that the type of "b" is too loose, no? I would like "b" to be of the type RecCons or RecNil as well. The looseness of b prevents me from writing functions like this:

data RecCons a b = RecCons a b |
             	     RecNil
                     deriving (Eq, Ord)

tupleLength :: RecCons a b -> Int
tupleLength RecNil = 0
tupleLength (RecCons x xs) = 1 + tupleLength xs -- xs really should be of type RecCons

What I would like is a list of arbitrary values rolled into a type such as (RecCons Int (RecCons String RecNil)). 

I tried a RecCons with existential quantification, but I ended up with a completely loosely-typed list. I would like Haskell's type engine to catch invalid comparisons between record tuples of disparate types. It seems that HDBRec works around this using a variety of typeclasses, but I don't really understand why.

Thanks for any advice.

Cheers,
M





More information about the Beginners mailing list