Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell HDBC.Sqlite3 fetchAllRows_Sqlite_Haskell_Hdbc - Fatal编程技术网

Haskell HDBC.Sqlite3 fetchAllRows

Haskell HDBC.Sqlite3 fetchAllRows,sqlite,haskell,hdbc,Sqlite,Haskell,Hdbc,由于我是一个绝对的哈斯克尔初学者,但决心征服它,我再次寻求帮助 使用: fetchData2 = do conn <- connectSqlite3 "dBase.db" statement <- prepare conn "SELECT * FROM test WHERE id > 0" execute statement [] results <- fetchAllRows statement print results 是否有一种聪明的方法将这

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

使用:

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

是否有一种聪明的方法将这些数据清理成
Int
[Char]
,换句话说,省略类型
SqlInt64
SqlByteString

,您可以定义一个助手:

fetchRowFromSql :: Convertible SqlValue a => Statement -> IO (Maybe [a])
fetchRowFromSql = fmap (fmap (fmap fromSql)) . fetchRow
这个实现看起来有点让人望而生畏,但这只是因为我们需要深入到分层的functor下面,正如您已经提到的(首先是
IO
,然后是
可能是
,最后是
[]
)。这将返回可从
SqlValue
转换的内容。已经定义了很多这样的概念。见例。例如(使用
-XTypeApplications
):


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

您可以定义一个帮助程序:

fetchRowFromSql :: Convertible SqlValue a => Statement -> IO (Maybe [a])
fetchRowFromSql = fmap (fmap (fmap fromSql)) . fetchRow
这个实现看起来有点让人望而生畏,但这只是因为我们需要深入到分层的functor下面,正如您已经提到的(首先是
IO
,然后是
可能是
,最后是
[]
)。这将返回可从
SqlValue
转换的内容。已经定义了很多这样的概念。见例。例如(使用
-XTypeApplications
):


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

提示您正在查找来自sql的
@Shawn:尝试过了。找不到任何有效的示例。更糟糕的是:fetchRow(我实际需要的一个)将列表包装为Maybe类型,并返回例如
Just[SqlInt64 3,SqlByteString“Newco”]
来添加:向下钻取值(更不用说包装为Maybe时)必须比这更简单:
fetchData2=do conn建议您正在寻找
fromSql
@Shawn:尝试过了。找不到任何有效的示例。更糟糕的是:fetchRow(我实际需要的一个)将列表包装为Maybe类型,并返回例如
Just[SqlInt64 3,SqlByteString“Newco”]
来添加:深入到值(更不用说包装为Maybe时)必须比这更简单:
fetchData2=do conn Hi Fredefox,感谢您的输入。我要试试看。我想Haskell初学者只有在阅读了4本左右的书之后才能通过做来学习……我可以通过使用
fromJust
从中获得它。这很有魅力<但是,code>fromSql
要求每个解析值都有一个类型约束,如
fromSql value::Int
。有没有一种快速的方法来解析几个不同类型的列,而Haskell更喜欢单一类型的列表。啊,是的,这是不幸的。也许这就是HDBC的作者不公开这样一个助手的原因。另一个库
sqlite simple
通过为长度不超过一定长度的元组定义等价的
Convertible
来解决这个问题。这里有一个快速而肮脏的解决方案:
three=\(a:b:c:[])->(fromsqla,fromSql b,fromSql c)
此方法不安全地将列表转换为具有转换值的三元组。我相信你可以为你的用例想出一些更优雅的东西。嗨,Fredefox,谢谢你的输入。我要试试看。我想Haskell初学者只有在阅读了4本左右的书之后才能通过做来学习……我可以通过使用
fromJust
从中获得它。这很有魅力<但是,code>fromSql
要求每个解析值都有一个类型约束,如
fromSql value::Int
。有没有一种快速的方法来解析几个不同类型的列,而Haskell更喜欢单一类型的列表。啊,是的,这是不幸的。也许这就是HDBC的作者不公开这样一个助手的原因。另一个库
sqlite simple
通过为长度不超过一定长度的元组定义等价的
Convertible
来解决这个问题。这里有一个快速而肮脏的解决方案:
three=\(a:b:c:[])->(fromsqla,fromSql b,fromSql c)
此方法不安全地将列表转换为具有转换值的三元组。我相信您可以为您的用例想出一些更优雅的东西。
fetchRowFromSql @String :: Statement -> IO (Maybe [String])