named-records-0.2.2: named-records.cabal
Name: named-records
Version: 0.2.2
Synopsis: Flexible records with named fields.
Description: Flexible records with named fields.
.
[@v0.2@] Default values with @record@.
.
[@v0.2.1@] Requires @names-0.2.1@.
.
[@v0.2.2@] TH @record@ definitions allow for
more types to be used in the definition.
.
Named records allow you to define und use records
with labeled fields. These records are first class
objects. Record fields are labeled by names, which
can basically be any type. However, the names package
provides global name types and some syntactic sugar
to use them.
.
Here is a complete walk-through, with Template Haskell
syntactic sugar.
.
This is how a typical example preamble looks like:
.
> {-# LANGUAGE Haskell2010, TemplateHaskell #-}
>
> import qualified Data.Name
> import Data.NamedRecord
.
In order to use names you need to declare them first
(see the @names@ package for further details):
.
> name "firstName"
> name "lastName"
.
These are two records @Person@ and @User@:
.
> record "Person"
> `has` "firstName" := ''String
> `has` "lastName" := ''String
>
> record "User"
> `has` "firstName" := ''String
> `has` "lastName" := ''String
> `has` "loginName" := ''String
.
Note that these declarations create constructor
functions @newPerson@ and @newUser@, as well as
type synonyms @Person@ and @User@ (use @-ddump-slices@
to see what has been generated).
.
Here are two instances of these recors:
.
> julian = newPerson
> `set` firstName := "Julian"
> `set` lastName := "Fleischer"
>
> alexander = newUser
> `set` firstName := "Alexander"
> `set` lastName := "Carnicero"
> `set` loginName := "alexander.carnicero"
.
We can now create a @displayName@ function like
the following:
.
> displayName obj =
> (obj `get` firstName) ++ " " ++
> (obj `get` lastName)
.
Note that this function will accept any record
that has a @firstName@ and a @lastName@ field of
type @String@.
.
>>> displayName julian
Julian Fleischer
.
>>> displayName alexander
Alexander Carnicero
.
As mentioned above, records are first class citizens.
That means you can create them anywhere:
.
>>> displayName (firstName := "John" :+ lastName := "Doe")
John Doe
License: MIT
License-File: LICENSE
Author: Julian Fleischer <julian.fleischer@fu-berlin.de>
Maintainer: Julian Fleischer <julian.fleischer@fu-berlin.de>
Build-Type: Simple
Cabal-Version: >= 1.6
Category: Data, Records
Stability: experimental
Library
Exposed-Modules: Data.NamedRecord
Build-Depends: base >= 4 && < 5,
names == 0.2.2,
template-haskell >= 2.7
Hs-Source-Dirs: src