Substitute for records?

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Substitute for records?

Mattias Bengtsson
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

_______________________________________________
Haskell-Cafe mailing list
[hidden email]
http://www.haskell.org/mailman/listinfo/haskell-cafe

signature.asc (198 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: Substitute for records?

Bjorn Bringert-2
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.

/Björn

[1] http://homepages.cwi.nl/~ralf/HList/
_______________________________________________
Haskell-Cafe mailing list
[hidden email]
http://www.haskell.org/mailman/listinfo/haskell-cafe