I have read the "Scrap Your Boilerplate: A Practical Design
Pattern for Generic Programming" and have worked out how to
do it. This seems much better than using Template Haskell for
this kind of problem. 

I used mkQ and extQ to convert from various types that are allowed
in the record structure, to an algebraic enumeration type that codes the
valid types. This allows using "everything (++)" to convert a record 
(tuple type) to a List of type-names in an enumeration. This is a very 
neet and compact way of doing it.

This enables me to define a database table in haskell (where a record 
represents a table with columns of the given types), for example:

data TestTable = TestTable {           
        column1 :: ColumnType Int,
        column2 :: ColumnType Float,
        column3 :: ColumnType String
}

type ColumnType a = String -- use phantom types to statically type check sql...

testTable :: TestTable
testTable = TestTable {
        column1 = "id",
        column2 = "aFloatValue"
        column3 = "aString"
}

Using generics I can now generate a list:

[("id",SqlInt),("aFloatValue",SqlFloat),("aString",SqlString)]

which can be used to check the Haskell version of the table against the version
in the database, or create the table if none exists...

This is for a kind of port of the HaskellDB stuff to ghc, although it is more
of a complete reimplementation using the same idea. My aim is to use a monad
transformer, so that db operations can be interleaved with other IO.

        Regards,
        Keean Schupke.
_______________________________________________
Glasgow-haskell-users mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to