【问题标题】:Lifting the monad IO in ConduitT on ResourceT在 ResourceT 上提升 ConduitT 中的 monad IO
【发布时间】:2018-10-11 13:12:30
【问题描述】:

我正在尝试使用 stm-conduit 中的 MergeSources 函数,它具有以下签名:

mergeSources :: (MonadResource mi, MonadIO mo, MonadUnliftIO mi)
             => [ConduitT () a mi ()] -- ^ The sources to merge.
             -> Int -- ^ The bound of the intermediate channel.
             -> mo (ConduitT () a mi ())    

我有直接基于 IO 的资源,但我不知道如何继续这个 mi Monad,我认为 ResourceT 是候选者:

所以我有以下签名的来源:

ConduitT () (Connection,WorkspaceId) IO ()

我想要这个签名:

ConduitT () (Connection,WorkspaceId) (ResourceT IO) ()

尽管事实上我没有资源可以处理这些操作(我有一个连接,但它是全球性的,这是他们推荐的......),我给你一个我想使用的函数的例子

streamAllWorkspaceAlreadyCreated :: Connection -> ConduitT () (Connection,WorkspaceId) IO ()
streamAllWorkspaceAlreadyCreated  eventStoreConnection = do
    yield eventStoreConnection
    .| WorkspaceStream.streamAll
    .| WorkspaceStream.discardCorruptedStreams
    .| mapC (\workSpaceId -> (eventStoreConnection,workSpaceId))

【问题讨论】:

    标签: haskell conduit


    【解决方案1】:

    transPipe怎么样:https://hackage.haskell.org/package/conduit-1.3.1/docs/Data-Conduit.html#v:transPipe

    transPipe :: Monad m => (forall a. m a -> n a) -> ConduitT i o m r -> ConduitT i o n r
    
    transPipe liftIO :: ConduitT i o IO r -> ConduitT i o (ResourceT IO) r
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-27
      • 2011-09-29
      • 1970-01-01
      • 2017-01-04
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多