gpt4 book ai didi

haskell - 是什么让 Iteratees 值得如此复杂?

转载 作者:行者123 更新时间:2023-12-02 08:09:54 26 4
gpt4 key购买 nike

首先,我了解迭代器的方式,足够了解我可以编写一个简单且有缺陷的实现,而无需引用任何现有的实现。

我真正想知道的是为什么人们似乎觉得它们如此迷人,或者在什么情况下它们的好处证明了它们的复杂性。将它们与惰性 I/O 进行比较有一个非常明显的好处,但对我来说这似乎很像稻草人。我从一开始就对惰性 I/O 感到不舒服,除了偶尔的 hGetContentsreadFile(大多数是在非常简单的程序中)之外,我都避免使用它。

在现实场景中,我通常使用传统的 I/O 接口(interface)以及适合任务的控制抽象。在这种情况下,我只是看不到迭代器的好处,或者它们对于什么任务来说是适当的控制抽象。大多数时候,它们看起来更像是不必要的复杂性,甚至是适得其反的控制反转。

我读过很多关于它们的文章和使用它们的资源,但还没有找到一个令人信服的例子,实际上让我思考“哦,是的,我会使用他们也在那里。”也许我只是没有读到正确的内容。或者也许有一个尚未设计的界面,比我见过的任何界面都简单,这会让它们感觉不像瑞士军电锯。

我只是患有“非发明综合症”还是我的不安是有根据的?或者可能完全是别的东西?

最佳答案

至于为什么人们觉得它们如此迷人,我认为是因为它们的想法非常简单。 recent discussion在 Haskell-cafe 上,关于迭代器的指称语义演变成了一种共识,即它们是如此简单,几乎不值得描述。那句话“只不过是带有暂停按钮的华丽左折”让我印象深刻。喜欢 Haskell 的人往往喜欢简单、优雅的结构,因此 iteratee 的想法可能非常有吸引力。

对我来说,迭代者的主要好处是

  1. 可组合性。不仅迭代器可以组合,枚举器也可以。这非常强大。
  2. 安全的资源使用。资源(主要是内存和句柄)无法逃脱其本地范围。与严格 I/O 相比,严格 I/O 更容易因不清理而造成空间泄漏。
  3. 高效。迭代者可以非常高效;与惰性 I/O 和严格 I/O 竞争或更好。

我发现迭代器在处理来自多个源的单个逻辑数据时提供最大的好处。这是可组合性最有帮助的时候,而具有严格 I/O 的资源管理是最烦人的(例如嵌套的 allocabracket)。

例如,在正在进行的音频编辑器中,声音数据的单个逻辑 block 是多个音频文件中的一组偏移量。我可以通过执行以下操作来处理单个声音 block (根据内存,但我认为这是正确的):

enumSound :: MonadIO m => Sound -> Enumerator s m a
enumSound snd = foldr (>=>) enumEof . map enumFile $ sndFiles snd

这对我来说似乎清晰、简洁、优雅,比同等的严格 I/O 更明显。 Iteratee 也足够强大,可以合并我想做的任何处理,包括写入输出,所以我觉得这非常好。如果我使用惰性 I/O,我可以获得同样优雅的东西,但在我看来,确保资源消耗和 GC 的额外小心将超过优势。

我还喜欢您需要在 iteratees 中显式保留数据,这可以避免臭名昭著的 mean xs = sum xs/length xs 空间泄漏。

当然,我并不是在所有事情上都使用迭代器。作为替代方案,我真的很喜欢 with* 习惯用法,但是当您有多个需要嵌套的资源时,它很快就会变得复杂。

关于haskell - 是什么让 Iteratees 值得如此复杂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3788853/

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