最佳答案
如果我有一个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
实例,也没有任何明显的“lift”方法。