Haskell 正在寻找一种更好的方法来编写以类型构造函数作为参数的函数

Haskell 正在寻找一种更好的方法来编写以类型构造函数作为参数的函数,haskell,servant,Haskell,Servant,我有一个Haskell服务应用程序。我想从文件中读取数据,并用文件内容填充数据库。我有的是这个 userList :: IO [User] productList :: IO [Product] data User = User { age :: Int, fname :: String, lname :: String } data Product = Product { title :: String, description :: String } data Item = UserI U

我有一个Haskell服务应用程序。我想从文件中读取数据,并用文件内容填充数据库。我有的是这个

userList :: IO [User]
productList :: IO [Product]

data User = User { age :: Int, fname :: String, lname :: String }
data Product = Product { title :: String, description :: String }
data Item = UserI User | ProductI Product

listUsers :: Handler [Entity User]
listProducts :: Handler [Entity Product]

hydrateUserDB :: Handler [Entity User]
hydrateUserDB = do
    items <- liftIO userList
    let list = fmap User items
    traverse_ createUser list
    listUsers

hydrateProductDB :: Handler [Entity Product]
hydrateProductDB = do
    items <- liftIO productList
    let list = fmap Product items
    traverse_ createProduct list
    listProducts
userList::IO[用户]
productList::IO[产品]
数据用户=用户{age::Int,fname::String,lname::String}
数据产品=产品{title::String,description::String}
数据项=用户i用户|产品i产品
listUsers::Handler[实体用户]
listProducts::Handler[实体产品]
HydreateUserDB::Handler[实体用户]
水合euserdb=do

items这可能是typeclass的一个很好的用途。将不同版本的内容放在一个类中。设计可能会有所改进,但这是第一步:

class DBItem a where
    itemList :: IO [a]
    createItem :: a -> Handler ()
    listItems :: Handler [Entity a]

instance DBItems User where
    itemList = userList
    createItem = ...
    listItems = listUsers

instance DBItems Product where
    itemList = productList
    ...

hydrateDB :: (DBItem a) => Handler [Entity a]
hydrateDB = do
    items <- liftIO itemList
    traverse_ createItem items
    listItems
类DBA项,其中
itemList::IO[a]
createItem::a->Handler()
listItems::Handler[实体a]
实例DBItems用户在哪里
itemList=userList
createItem=。。。
listItems=listUsers
实例DBItems产品,其中
itemList=productList
...
hydrateDB::(DBItem a)=>Handler[实体a]
水合的

items这可能是typeclass的一个很好的用途。将不同版本的内容放在一个类中。设计可能会有所改进,但这是第一步:

class DBItem a where
    itemList :: IO [a]
    createItem :: a -> Handler ()
    listItems :: Handler [Entity a]

instance DBItems User where
    itemList = userList
    createItem = ...
    listItems = listUsers

instance DBItems Product where
    itemList = productList
    ...

hydrateDB :: (DBItem a) => Handler [Entity a]
hydrateDB = do
    items <- liftIO itemList
    traverse_ createItem items
    listItems
类DBA项,其中
itemList::IO[a]
createItem::a->Handler()
listItems::Handler[实体a]
实例DBItems用户在哪里
itemList=userList
createItem=。。。
listItems=listUsers
实例DBItems产品,其中
itemList=productList
...
hydrateDB::(DBItem a)=>Handler[实体a]
水合的

是的。我得到了它。谢谢。你如何处理typeclass中的构造函数?在有fmap的行中,有一个代表构造函数的“con”。对于用户和产品,此类型签名可能不同(在我提供的原始示例中,它们是相同的,但可能不同)。@7puns看看类型族。但是要小心,不要太快接触到这些高级功能,附近通常有更简单的设计,这样或那样移动抽象的边界。是的。我得到了它。谢谢。你如何处理typeclass中的构造函数?在有fmap的行中,有一个代表构造函数的“con”。对于用户和产品,此类型签名可能不同(在我提供的原始示例中,它们是相同的,但可能不同)。@7puns看看类型族。但要小心,不要太快接触到这些高级功能,附近通常有更简单的设计,这样或那样移动抽象的边界。