gpt4 book ai didi

haskell - 枚举器与导管的优缺点是什么?管道?

转载 作者:行者123 更新时间:2023-12-03 08:30:06 25 4
gpt4 key购买 nike

我想听听比我有更深入了解的人说Enumerators 之间的根本区别是什么。 , Conduits , 和 Pipes以及主要的优点和缺点。一些 discussion's already ongoing但最好有一个高层次的概述。

最佳答案

枚举器/迭代器作为抽象是由 Oleg Kiselyov 发明的。它们提供了一种干净的方式来执行具有可预测(低)资源要求的 IO。当前的 Enumerators 包非常接近 Oleg 的原始作品。

管道是为 Yesod Web 框架创建的。我的理解是,它们的设计速度非常快。该库的早期版本是高度有状态的。

管道专注于优雅。它们只有一种类型而不是多种类型,形成 monad(变压器)和类别实例,并且在设计上非常“实用”。

如果您喜欢分类解释:Pipe type 只是下面简单的仿函数上的自由单子(monad)

data PipeF a b m r = M (m r) | Await (a -> r) | Yield b r
instance Monad m => Functor (PipeF a b m) where
fmap f (M mr) = M $ liftM mr
fmap f (Await g) = Await $ f . g
fmap f (Yield b p) = Yield b (f p)
--Giving:
newtype Pipe a b m r = Pipe {unPipe :: Free (PipeF a b m) r}
deriving (Functor, Applicative, Monad)

--and
instance MonadTrans (Pipe a b) where
lift = Pipe . inj . M

在实际的管道定义中,这些都包含在内,但是这个定义的简单性是惊人的。管道构成操作 (<+<) :: Monad m => Pipe c d m r -> Pipe a b m r -> Pipe a d m r 下的一个类别它采用第一个管道 yields并将其馈送到等待的第二个管道。

看起来像 Conduits正在变得更多 Pipe比如(使用 CPS 代替状态,并切换到单一类型),而 Pipes 正在获得对更好的错误处理的支持,并且可能为生成器和消费者返回单独的类型。

这个领域正在迅速发展。我一直在破解具有这些功能的 Pipe 库的实验变体,并且知道其他人也是如此(请参阅 Hackage 上的 Guarded Pipes 包),但怀疑 Gabriel(Pipes 的作者)会在我之前弄清楚它们做。

我的建议:如果您使用 Yesod,请使用 Conduits。如果您想要一个成熟的库,请使用 Enumerator。如果您主要关心优雅,请使用 Pipe。

关于haskell - 枚举器与导管的优缺点是什么?管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9983840/

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