0

由于我是一个绝对的 Haskell 初学者,但决心征服它,我再次寻求帮助。

使用:

fetchData2 = do
  conn <- connectSqlite3 "dBase.db"
  statement <- prepare conn "SELECT * FROM test WHERE id > 0"
  execute statement []
  results <- fetchAllRows statement
  print results

返回:

[[SqlInt64 3,SqlByteString "Newco"],[SqlInt64 4,SqlByteString "Oldco"],[SqlInt64 5,SqlByteString "Mycom"],[SqlInt64 4,SqlByteString "Oldco"],[SqlInt64 5,SqlByteString "Mycom"]]

有没有一种聪明的方法可以将这些数据清理到Intand[Char]中,换句话说,省略类型SqlInt64and SqlByteString

4

1 回答 1

2

你可以定义一个助手:

fetchRowFromSql :: Convertible SqlValue a => Statement -> IO (Maybe [a])
fetchRowFromSql = fmap (fmap (fmap fromSql)) . fetchRow

实现看起来有点令人生畏,但这只是因为我们需要深入了解分层仿函数,正如您已经指出的(首​​先IO,然后Maybe和最后[])。这将返回可从 a 转换的东西SqlValue。已经定义了很多这些。参见例如文档。一个例子(使用-XTypeApplications):

fetchRowFromSql @String :: Statement -> IO (Maybe [String])

我也许应该补充一点,文档提到这fromSql是不安全的。这意味着如果您尝试将 sql 值转换为不兼容的 Haskell 值,程序将停止。

于 2018-08-29T18:30:20.130 回答