Якщо у мене є 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
це справді просто обгортка навколоStepT => IterateeT
, що говорить про те, що вам потрібно буде "відступити" з аStepT[E, BigMonad, A]
.