【发布时间】:2016-10-22 09:38:46
【问题描述】:
有没有办法在类型系统中轻松做到以下几点?
data Product = Product {
id :: ProductId
, name :: Text
, sku :: SKU, quantity :: Int
, description :: Maybe Text
}
data Omittable a = Omit | Present a
type ProductWithOmittableFields = Omittable Product
-- ProductWithOmittableFields is now equivalent to:\
--
-- data ProductWithOmittableFields = ProductWithOmmitableFields {
-- id :: Omittable ProductId
-- ,name :: Omittable Text
-- ,sku : : Omittable SKU
-- ,quantity :: Omittable Int
-- ,desciption :: Omittable (Maybe Text)
-- }
它基本上是某种容器(函子?),在类型级别应用于记录的每个字段。
用可扩展的记录库能更好地表达这个想法吗?
edit用例是我们会从UI层得到一个ProductWithOmittableFields,代表已经被用户改变的字段集合;我们将从数据库中得到一个Product,我们将它们合并得到Product的新值
【问题讨论】:
-
“这个想法是否可以通过可扩展的记录库更好地体现?”有一个名为“generics-sop”的库可以让你做类似的事情。请参阅这些其他问题:stackoverflow.com/questions/39020787/… 和 stackoverflow.com/questions/38248692/…