haskell – 用postgresql-simple创建一个流媒体管道源

haskell – 用postgresql-simple创建一个流媒体管道源,第1张

概述postgresql-simple提供用于流式查询的功能,例如, fold :: (FromRow row, ToRow params) => Connection -> Query -> params -> a -> (a -> row -> IO a) -> IO a 我想创建一个充分利用流媒体管道源. mySource :: (FromRow row, Monad m) => S postgresql-simple提供用于流式查询的功能,例如,

fold   :: (Fromrow row,ToRow params)  => Connection -> query -> params -> a -> (a -> row -> IO a) -> IO a

我想创建一个充分利用流媒体的管道源.

mySource :: (Fromrow row,Monad m) => Source m row

不幸的是,因为IO在折叠中出现在逆向位置(我认为?),所以我真的很难对付这些类型.以下类型检查,但在产生值之前折叠整个流.

getConduit :: Connection -> IO (C.ConduitM () Event IO ())getConduit conn = fold_ conn queryEventRecord CL.sourceNull foo  where    foo :: C.ConduitM () Event IO () -> Event -> IO (C.ConduitM () Event IO ())    foo cond evt = pure (cond >> C.yIEld evt)

关于如何实现这一点的任何指针将不胜感激!谢谢!

解决方法 一个(不太好)的方式来解决这个问题

>创建一个新的TMChan来接收行
>将foreach_设置为仅将行转储到此通道中
>最后使用stm-conduit从频道中制作出来源

我没有办法对此进行测试,但以下情况应该有效

import Conduitimport Database.Postgresql.Simple (foreach_)import Data.Conduit.TMChan (sourceTMChan)import Control.Concurrent.STM.TMChan (newTMChanIO,writeTMChan,atomically)mySource :: (Fromrow row,Monadio m) => Connection -> query -> IO (Source m row)mySource connection query = do  chan <- newTMChanIO  forEach_ connection query (atomically . writeTMChan chan)  pure (sourceTMChan chan)

如果我们只有forEach_ ::(Monadio m,Fromrow r)=>连接 – >查询 – > (r – > m()) – > m()这可能更容易……

总结

以上是内存溢出为你收集整理的haskell – 用postgresql-simple创建一个流媒体管道源全部内容,希望文章能够帮你解决haskell – 用postgresql-simple创建一个流媒体管道源所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1160518.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存