[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