2

背景

我有一长串文件,我想将其内容流式传输到恒定内存中。

我正在使用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可以定义函数吗?

4

0 回答 0