[Haskell-cafe] Re: HList and Type signatures / synonyms
David Menendez
dave at zednenem.com
Mon Sep 7 15:38:37 EDT 2009
2009/9/6 Günther Schmidt <gue.schmidt at web.de>:
>
> I keep reading in and processing data in an accumulating way, ie. lets say I
> have a DB table (don't take this literally please, just an example), into
> in-memory records of type
>
> data MyRecord = MyRecord {
> name :: String,
> birthDate :: LocalDate}
>
> in a second step I read in Gender information so now I'd need an extended
> Record
>
> data MyRecord = MyRecord {
> name :: String,
> birthDate :: LocalDate,
> gender :: Gender }
>
> and so on for another 12 times.
>
> In other words I need to extend the record.
>
> I had been using tuples, ie:
>
> (String, LocalDate) -> Gender -> (String, LocalDate, Gender)
>
>
> but after 6 or so *extensions* things get a tad messy.
<snip>
> So I wonder if there is a more simple way to do this, ie to *extend* the
> *type* signatures of extend records without such a lot of typing.
Do you actually need the intermediate data? More specifically, do you
need the data to be partial records?
One simple way to represent a partial record is a function which takes
the missing fields as arguments and returns the complete record, i.e.,
a constructor like MyRecord :: String -> LocalDate -> Gender ->
MyRecord.
So a partial result with the name filled in would have type LocalDate
-> Gender -> MyRecord.
More specifically, if the computations which produce the fields are
described using a monad or applicative functor, e.g., getName ::
Process String, you can just use <$> and <*> to glue them together.
MyRecord <$> getName <*> getDate <*> getGender
Or, if your process abstraction is a monad, you can do more complex operations.
do name <- getName
date <- getDate
gender <- getGender name date
return $ MyRecord name date gender
Instead of constructing intermediate records, all the data is kept in
variables until the record is complete.
--
Dave Menendez <dave at zednenem.com>
<http://www.eyrie.org/~zednenem/>
More information about the Haskell-Cafe
mailing list