背景
我有一长串大文件,我想将其内容流式传输到恒定内存中。
我正在使用Haskell Pipes 库使用以下嵌套类型对该流进行建模:
Producer (FilePath, Producer ByteString IO ()) IO ()
换句话说,外部生产者迭代文件,内部生产者迭代文件块。
问题
出于会计目的,我想暂时将此嵌套流扁平化为具有以下类型的内容:
Producer FileStreamEvent IO ()
在哪里:
type FileStreamEvent = NestedStreamEvent FilePath ByteString
data NestedStreamEvent a b = NestedStreamOpen a
| NestedStreamChunk b
| NestedStreamClose a
编写一个函数来执行这种转换似乎很容易:
flattenNestedStream :: Monad m
=> Producer (a, Producer b m r) m r
-> Producer (NestedStreamEvent a b) m r
flattenNestedStream abs = for abs $ \(a, bs) -> do
yield $ NestedStreamOpen a
for bs $ \b -> yield $ NestedStreamChunk b
yield $ NestedStreamClose a
但是,我不确定如何编写逆变换:
nestFlattenedStream :: Monad m
=> Producer (NestedStreamEvent a b) m r
-> Producer (a, Producer b m r) m r
这样:
(nestFlattenedStream . flattenNestedStream) producer == producer
nestFlattenedStream
可以定义函数吗?