[Haskell-cafe] Substitute for records?

Björn Bringert bringert at cs.chalmers.se
Mon Apr 10 16:18:29 EDT 2006

Mattias Bengtsson wrote:
> Currently i'm working, together with a friend, on an abstraction (sort
> of) of HaskellDB for a school-project.
> Basically we are generating haskell-modules similar to those generated
> by DBDirect in HaskellDB together with some helpers for the most common
> queries you'd want to run.
> HaskellDB has its own record system (HDBRec) and a HaskellDB-query also
> returns such a record. The accessor-functions for these records can
> later be found in DatabaseName.TableName.ColumnName.column. These should
> be imported qualified to avoid name clashes.
> This is some example code:
>   students <- School.Students.all db
>   mapM_ printStudentId students
>   printStudentId rec = print $ rec!School.Students.Id.column
> The main problem for me here is this part:
>   rec!School.Students.Name.column
> where i would rather just write 
>   rec!id 
> This isn't possible and the other way is just too messy for my taste. It
> simply isn't the easy and nice syntax i had hoped for when we started to
> develop this.
> Are there any other nice substitutes for HDBRec or normal haskell
> records that i could use that doesn't make name clashes an issue?
> Mattias

It's not perfect, but you can make it a lot shorter by importing the 
modules that declare the fields with shorter names:

   import qualified School.Students as Students
   import qualified School.Students.Name as Name

   students <- Students.all db
   mapM_ printStudentId students

   printStudentId rec = print $ rec!Name.column

But the right answer, I'm afraid, is that there is no really nice way to 
work with records in today's Haskell.

You may want to have a look at HList [1] to see if that works better. If 
it does, you are very welcome to port HaskellDB to use it instead of HDBRec.


[1] http://homepages.cwi.nl/~ralf/HList/

More information about the Haskell-Cafe mailing list