在 haskell流中,有一个复制的例子
>>> (S.toList . mapped S.toList . chunksOf 5) $ (S.toList . mapped S.toList . chunksOf 3) $ S.copy $ each [1..10]
[[1,2,3,4,5],[6,7,8,9,10]] :> ([[1,2,3],[4,5,6],[7,8,9],[10]] :> ())
是否可以将其分成两个“干净”的流,以便它可以在结果下方打印?
>>>S.print stream1
[[1,2,3,4,5],[6,7,8,9,10]]
>>>S.print stream2
[[1,2,3],[4,5,6],[7,8,9],[10]]
请注意,上面的结果中没有更多的 ':>'。更一般地说,我不确定是否有函数可以“简化”嵌套流(或流的流)来自m
或(Of a)
参与Stream (Of a) m r
f1::Stream (Of a) (Stream (Of b) m) r -> Stream (Of b) m r
f2::Stream (Of a) (Stream (Of b) m) r -> Stream (Of a) m r
f3::Stream (Stream (Of a) m) r -> Stream (Of a) m r
[更新]
这个问题的背景是我正在寻找多次重用底层流的惯用方法。流是从数据库中提取的,IO 可能很昂贵。我还想获得对中间流的引用,以便更好地构建我的代码。一些模拟代码:
my-stream-fn = do
original_stream <- pull_from_database
let (o1, s1) = calc_moving_average $ S.copy original_stream
(o2, s2) = calc_max $ S.copy o1
(o3, s3) = calc_min $ S.copy o2
S.print $ S.zipWith3 (\x y z-> (x, y, z)) s1 s2 s3
我希望 o1 o2 和 o3 与 original_stream 和 pull_from_database IO 操作完全相同,只在提取 original_stream 时执行一次。