gpt4 book ai didi

haskell - 在枚举器中组合枚举器

转载 作者:行者123 更新时间:2023-12-04 04:35:47 24 4
gpt4 key购买 nike

免责声明:这是最近在 haskell-cafe 列表上提出的问题。我向任何受到双重职位困扰的人道歉。

我知道的所有迭代实现包(例如 iterateeiterIOconduit )都定义了一个枚举组合函数,除了 enumerator包裹。在我看来,这似乎是一个严重的限制,但实现起来也相对简单:

import Data.Enumerator
import Data.Enumerator.Internal

(=$=) :: Monad m
=> Enumeratee a0 a1 m (Step a2 m b) -> Enumeratee a1 a2 m b
-> Enumeratee a0 a2 m b
(=$=) e01 e12 step = Iteratee $ do
step' <- runIteratee $ e12 step
runIteratee . joinI $ e01 step'

这里有一些我想念的问题吗?或 enumerator 的其他原因不定义枚举组成?

最佳答案

现在有 enumerator 的新版本 (0.4.17)其中包括 (=$=)带有我上面给出的签名的运算符(operator)。我给包的作者发了电子邮件,他很好地反对在包中包含许多简化的运算符(如 ($=)(=$) 和现在的 (=$=) )。

基本上,问题在于处理剩余输入。 joinI组合子

joinI :: Monad m => Iteratee a m (Step a' m b) -> Iteratee a m b

丢弃剩余的 Stream a'这是由内部 Iteratee 产生的.如果使用类似的样式,这不是问题
joinI (foo $$ (bar $$ baz))

其中剩余的数据仅在计算结束时被丢弃。但是,使用简化的运算符会导致多个隐式连接,并且剩余数据变得更难以跟踪。如果使用的迭代器很简单(即它们不会产生剩余数据),那么这不是问题,并且简化的运算符使用起来很有意义。

关于haskell - 在枚举器中组合枚举器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8674774/

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