gpt4 book ai didi

haskell - 使用Conduit实现累加功能

转载 作者:行者123 更新时间:2023-12-02 17:02:07 24 4
gpt4 key购买 nike

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

相反?

最佳答案

scanlC ,它是“列表的 scanl 的类似物”,几乎可以满足您的需求。我说“几乎”是因为 scanlC 要求并产生一个初始“种子”值,您不需要也不想要该值(参见 scanl 之间的区别>scanl1)。既然如此,您将需要显式地提供第一个流式传输值作为种子:

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

(显然较差的替代方案是使用 trans = scanlC (+) 0 并在管道的下一步中使用 dropC 1 来摆脱0。)

关于haskell - 使用Conduit实现累加功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49235610/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com