タイプシステムで次のように簡単に行う方法はありますか?タイプレベルのレコード内のすべてのフィールドに関数を適用する
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)
-- }
これは、基本的には、コンテナ(ファンクタ?)タイプ・レベルでのレコードのすべてのフィールドに適用されるのいくつかの並べ替えです。
この考え方は、拡張可能なレコードライブラリでよりよく表現されますか?
編集ユースケースは、ユーザーによって変更されたフィールドのセットを表すUIレイヤーからProductWithOmittableFields
が得られることです。我々は、DBからProduct
を取得する、と私たちはProduct
"この考えは、拡張可能なレコードライブラリでよりよく表現されていますか?"あなたはそれのような何かをすることができます "ジェネリックスソップ"と呼ばれるライブラリがあります。これらの他の質問を参照してください:http://stackoverflow.com/questions/39020787/is-there-a-way-to-apply-maybe-constructor-to-each-field-of-record-with-generics and http: /stackoverflow.com/questions/38248692/whats-a-better-way-of-managing-large-haskell-records – danidiaz