[Haskell-cafe] Yet Another Named Record

Dmitry Olshansky olshanskydr at gmail.com
Thu Dec 3 16:16:53 UTC 2015

Hello, cafe!

I made a small library https://github.com/odr/pers. It is my attempt for
Named Record problem.
There is no TH, just TF, Symbols and so on.

With this library one can now:

* Construct record sequentially (record is balanced tuple-based tree):
type T = "a":>Int +> "b":>String +> "c":>Maybe Int
rec = V 5 +> V "b" +> V (Just 3) :: T

* Get Lens' for fields or record (group of fields) with O(k*log n) access:
lb = fieldLens (Proxy :: "b":>String) :: Lens' T String
lca = recLens :: Lens' T ("c:>Maybe Int +> "a":>Int)

Note that recLens is Projection!

* Lift all fields into Functor:
type LT = Lifted Maybe T
-- LT == "a":>Maybe Int +> "b":>Maybe String +> "c":>Maybe (Maybe Int)

If all fields has Default instances, record has it also. It is the case for
Lifted Maybe T.

* Convert from and to Map of fields (using PersistField and PersistValue
from persistent package)
m = M.fromList  [ (someSymbolVal "a", toPersistValue 1)
                , (someSymbolVal "b", toPersistValue "xx")
                -- value for "c" is optional
recEither = mapToRec (Proxy :: Proxy T) m :: Either [SomeSymbol] T
m' = fmap toMap recEither

I wonder:

- Are there similar attempts?
- Is it interesting? I suppose it could be used as basis for Persistent
(instead of TH). Is it? Other application?
- What other features you want to add here?

Best regards,
Dmitry Olshansky
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20151203/c6b51c23/attachment.html>

More information about the Haskell-Cafe mailing list