如果我有一个EnumeratorT
和相应的IterateeT
,我可以将它们一起运行:
val en: EnumeratorT[String, Task] = EnumeratorT.enumList(List("a", "b", "c"))
val it: IterateeT[String, Task, Int] = IterateeT.length
(it &= en).run : Task[Int]
如果枚举器单子比迭代器单子"大",我可以使用up
或更一般的Hoist
来"提升"迭代器以匹配:
val en: EnumeratorT[String, Task] = ...
val it: IterateeT[String, Id, Int] = ...
val liftedIt = IterateeT.IterateeTMonadTrans[String].hoist(
implicitly[Task |>=| Id]).apply(it)
(liftedIt &= en).run: Task[Int]
但是当被迭代的单子比枚举器单子更“大”时,我该怎么做?
val en: EnumeratorT[String, Id] = ...
val it: IterateeT[String, Task, Int] = ...
it &= ???
看起来并没有针对 EnumeratorT
的 Hoist
实例,也没有明显的“提升”方法。
Enumerator
实际上只是一个围绕StepT => IterateeT
的包装器,这表明您需要从StepT[E,BigMonad,A]
中“跨越”(step down)来实现。 - Travis BrownEnumerator
只是一个有副作用的源,对吗?感觉应该可以使用一个能提供A
的东西来提供Task[A]
。 - lmm