Есть ли способ сделать следующее в системе типов легко?Применить функцию ко всем полям записи на уровне уровня
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)
-- }
Это в основном своего рода контейнера (функтора?), Который применяется к каждому полю записи на уровне типа.
Является ли эта идея лучше представленной библиотекой расширяемых записей?
Редактировать В случае использования мы получим ProductWithOmittableFields
с уровня пользовательского интерфейса, представляющего набор полей, которые были изменены пользователем; мы получим Product
из БД, и мы будем объединять их, чтобы получить новое значение Product
«Является ли эта идея лучше представленной библиотекой расширяемых записей?» Существует библиотека под названием «generics-sop», которая позволяет вам делать что-то подобное. См. Другие вопросы: http://stackoverflow.com/questions/39020787/is-there-a-way-to-apply-maybe-constructor-to-each-field-of-record-with-generics и http://stackoverflow.com/questions/38248692/whats-a-better-way-of-managing-large-haskell-records – danidiaz