Jika saya punya EnumeratorTdan yang sesuai IterateeTsaya bisa menjalankannya bersama-sama:
val en: EnumeratorT[String, Task] = EnumeratorT.enumList(List("a", "b", "c"))
val it: IterateeT[String, Task, Int] = IterateeT.length
(it &= en).run : Task[Int]
Jika enumerator monad "lebih besar" dari iteratee monad, saya dapat menggunakan upatau, secara umum, Hoistuntuk "mengangkat" iteratee agar sesuai:
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]
Tetapi apa yang harus saya lakukan ketika iteratee monad "lebih besar" daripada enumerator monad?
val en: EnumeratorT[String, Id] = ...
val it: IterateeT[String, Task, Int] = ...
it &= ???
Tampaknya tidak ada Hoistcontoh untuk EnumeratorT, atau metode "lift" yang jelas.
Enumeratoritu hanya sumber yang efektif, bukan? Rasanya seperti saya harus dapat menggunakan sesuatu yang dapat memasok Auntuk memasok Task[A].
Enumeratorbenar-benar hanya pembungkus di sekitar aStepT => IterateeT, yang menunjukkan bahwa Anda harus "mundur" dari aStepT[E, BigMonad, A].