Haskell HDBC库:有没有一种优雅的方法可以在[SqlValue]和记录之间转换



由于我不能对记录进行map,所以我找到的最好方法是使用蛮力:

data Item = Item {
vendor :: Int,
lotNumber :: Int,
description :: String,
reserve :: Maybe Double,
preSaleBids :: Maybe Double,
salePrice :: Maybe Double,
purchaser :: Maybe Int,
saleID :: Maybe Int
}
hsToDb :: Item -> [SqlValue]
hsToDb (Item a b c d e f g h) = [toSql a, toSql b, toSql c, toSql d, toSql e, toSql f, toSql g, toSql h]
dbToHs :: [SqlValue] -> Item
dbToHs [a,b,c,d,e,f,g,h] = Item (fromSql a) (fromSql b) (fromSql c) (fromSql d) (fromSql e) (fromSql f) (fromSql g) (fromSql h)

这段代码看起来很难看,如果我更改Item记录的长度,也需要更新,所以我想知道是否有一种巧妙的方法可以推广这个想法。

根据您使用的库,类型(Int, Int, String, ...)可能已经有一个(例如sqlite-simple(FromRow实例。如果您需要Item成为一个新类型,则可以使用GeneralizedNewtypeDeriving扩展免费获得该实例。除此之外,您当然可以定义自己的类型class/helper方法,使其更加DRY。

相关内容

  • 没有找到相关文章

最新更新