使用Conduit实现累积功能

时间:2018-03-12 12:46:25

标签: haskell conduit

我正在探索使用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

代替?

1 个答案:

答案 0 :(得分:1)

scanlC,这是&{34;类似于scanl的列表",几乎可以满足您的需求。我说"几乎"因为scanlC要求并产生一个初始种子"您不需要也不想要的价值(参见scanlscanl1之间的差异)。既然如此,您将需要显式提供第一个流值作为种子:

trans :: Monad m => ConduitM Int Int m ()
trans = await >>= maybe (return ()) (scanlC (+))

(明显低级 - 替代方案是trans = scanlC (+) 0并在管道的下一步使用dropC 1来摆脱0。)