# Bookkeeper Bookkeeper is a new Haskell library that uses the new OverlodaedLabels feature of GHC 8 to provide a new take on datatypes and records: ~~~ {.haskell} {-# LANGUAGE DataKinds #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE OverloadedLabels #-} import Bookkeeper jane :: Book '[ "name" :=> String, "age" :=> Int ] jane = emptyBook & #name =: "Jane" & #age =: 30 -- >>> jane -- Book {age = 30, name = "Jane"} -- >>> jane ?: #name -- "Jane" ~~~ It bears some similarities to Nikita Volkov's [record](https://nikita-volkov.github.io/record/) library, but requires no Template Haskell. Accesing a field that does not exist is a type error, made nicer with GHCs new custom type errors: ~~~ {.haskell} -- >>> jane ?: #address -- • The provided Book does not contain the field "address" -- Book type: -- '["age" ':-> Int, "name" ':-> String] ~~~ The order in which fields are inserted or appear in types does not matter. That is, in: ~~~ {.haskell} -- type A = Book '[ "field1" :=> Int, "field2" :=> Bool] -- type B = Book '[ "field2" :=> Bool, "field1" :=> Int ] ~~~ Types `A` and `B` are the same. You can set, modify, or get fields. See the haddocks for more information. ~~~ {.haskell} main :: IO () main = return () ~~~