Haskell HDBC 库:有没有一种优雅的方法可以在 [SqlValue] 和记录之间进行转换?
Haskell HDBC library: Is there an elegant way to convert between [SqlValue] and records?
因为我不能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 方法以使其更干。
因为我不能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 方法以使其更干。