有没有办法在类型系统中轻松完成以下操作?
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)
--  }
它基本上是某种容器(仿函数?),它应用于类型级别的记录的每个字段.
这个想法是否可以用可扩展的记录库更好地表示?
编辑用例是我们将从ProductWithOmittableFieldsUI层获取一个,表示用户已更改的字段集; 我们将从Product数据库中获取一个,我们将合并它们以获得新值Product
一种可能的方式:
import Control.Functor.Identity
data Product k = Product {
    id :: k ProductId
  , name :: k Text
  , sku :: k SKU
  , quantity :: k Int
  , description :: k (Maybe Text)
  }
data Omittable a = Omit | Present a
type ProductWithOmittableFields = Product Omittable
type ProductWithRegularFields = Product Identity
例子:
testOmit :: ProductWithOmittableFields
testOmit = Product
     { id = Present someProductId
     , name = Omit
     ... }
testReg :: ProductWithRegularFields
testReg = Product
     { id = Identity someProductId
     , name = Identity someText
     ... }
这种方法仅具有Identity在常规情况下用每个字段包裹的轻微不便.
| 归档时间: | 
 | 
| 查看次数: | 237 次 | 
| 最近记录: |