haskell - 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, ...)
可能已经有一个(如在 eg 中sqlite-simple
)FromRow
实例。如果您需要Item
成为新类型,您可以使用GeneralizedNewtypeDeriving
扩展免费获取该实例。除此之外,您当然可以定义自己的类型类/辅助方法以使其更加干燥。
推荐阅读
- c++ - 如何计算 COLLADA 文件的父子联合变换?
- unreal-engine4 - 如何在 UE4 中正确设置 HUD 小部件
- javascript - 是否有带有材质 UI 的 NavBar 元素
- .net - 关于等待任务异步的非常简单的问题
- node.js - 将我的 jwt 令牌放在 cookie 中,以保持用户在刷新之间登录并提高安全性
- ios - 在 Obj C 模块中导入 Swift 模块
- javascript - javascript global page vars - 有这样的事情吗?
- javascript - Apollo useQuery 在返回值之前多次返回未定义?
- python - Bokeh 问题中的 Python 回调
- node.js - Discord.js 错误:错误:找不到 FFmpeg/avconv!即使安装