Если у меня есть 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 &= ???
Кажется , нет ни одного Hoistпримера EnumeratorT, ни какого-либо очевидного метода «подъема».
Enumeratorпросто эффективный источник, верно? Такое чувство, что я должен быть в состоянии использовать то, что может поставить Aдля снабжения Task[A].
Enumeratorсамом деле это просто обертка вокруг aStepT => IterateeT, которая предполагает, что вам нужно «уйти в отставку» отStepT[E, BigMonad, A].