【发布时间】:2023-04-11 04:09:01
【问题描述】:
我有一个值body :: BS.ByteString (ResourceT IO) (),来自基于BS.readFile 的函数。我想将该值作为来自Wai Application 的响应正文进行流式传输。有一个帮助器streamingResponse,它采用Stream (Of ByteString) IO r 类型的值。我可以通过使用BS.toChunks 将我的BS.ByteString (ResourceT IO) () 转换为Stream (Of ByteString) (ResourceT IO) (),但它包含一个额外的ResourceT monad 层。将body 传递给streamingResponse 给了我:
Couldn't match type ‘ResourceT IO’ with ‘IO’
Expected type: Stream (Of ByteString) IO ()
Actual type: Stream (Of ByteString) (ResourceT IO) ()
我尝试了各种方法,例如在 runResourceT 中包装东西、绑定和提升值等,但我真的不知道如何进行。如果需要额外的上下文,Here 是整个项目中的行。
更新0
hoist runResourceT body 似乎在进行类型检查。有人还向我推荐了 Haskell Pipes thread,这可能是一个非常相关的问题,并且可能暗示了解决方案。
【问题讨论】:
-
hoist runResourceT body类型检查,但我认为它实际上不会做你想做的事。我怀疑它将流的每个“步骤”作为一个孤立的资源上下文,而不是期望的行为。 -
同意。很确定
runResourceT $ m >>= f不等于runResourceT m >>= runResourceT . f,这是您需要应用hoist的属性。 -
是的,我可以确认
hoist runResourceT body没有按我的预期工作。
标签: haskell bytestring haskell-wai haskell-warp haskell-streaming