gpt4 book ai didi

haskell - 在类型级别将函数应用于记录中的所有字段

转载 作者:行者123 更新时间:2023-12-02 16:57:52 27 4
gpt4 key购买 nike

有没有办法在类型系统中轻松执行以下操作?

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的新值

最佳答案

一种可能的方法:

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 包装每个字段的轻微不便。

关于haskell - 在类型级别将函数应用于记录中的所有字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40171037/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com