我正在探索使用Conduit包的可能性,以便在Haskell中实现复杂的事件处理。举个例子,我想用Conduit实现一个累积函数。
从:
开始#!/usr/bin/env stack
-- stack script --resolver lts-8.12 --package conduit-combinators
{-# LANGUAGE ExtendedDefaultRules #-}
import Conduit
trans :: Monad m => ConduitM Int Int m ()
trans = do
mapC (* 2)
main :: IO ()
main = runConduit $ yieldMany [1..10] .| trans .| mapM_C print
我明白了:
2 4 6 8 10 12 14 16 18 20
如何修改trans
以使其产生
1 3 6 10 15 21 28 36 45 55
代替?
答案 0 :(得分:1)
scanlC
,这是&{34;类似于scanl
的列表",几乎可以满足您的需求。我说"几乎"因为scanlC
要求并产生一个初始种子"您不需要也不想要的价值(参见scanl
和scanl1
之间的差异)。既然如此,您将需要显式提供第一个流值作为种子:
trans :: Monad m => ConduitM Int Int m ()
trans = await >>= maybe (return ()) (scanlC (+))
(明显低级 - 替代方案是trans = scanlC (+) 0
并在管道的下一步使用dropC 1
来摆脱0
。)