Jeśli mam EnumeratorT
odpowiedni odpowiednik IterateeT
, mogę je uruchomić razem:
val en: EnumeratorT[String, Task] = EnumeratorT.enumList(List("a", "b", "c"))
val it: IterateeT[String, Task, Int] = IterateeT.length
(it &= en).run : Task[Int]
Jeśli monada modułu wyliczającego jest „większa” niż monada iteracyjna, mogę użyć up
lub, bardziej ogólnie, Hoist
„podnieść” iterat, aby dopasować:
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]
Ale co mam zrobić, gdy monada iteracyjna jest „większa” niż monada wyliczająca?
val en: EnumeratorT[String, Id] = ...
val it: IterateeT[String, Task, Int] = ...
it &= ???
Wydaje się, że nie ma Hoist
instancji EnumeratorT
ani żadnej oczywistej metody „podnoszenia”.
Enumerator
jest tylko skutecznym źródłem, prawda? Wydaje mi się, że powinienem być w stanie użyć rzeczy, która może dostarczyć A
do zaopatrzenia Task[A]
.
Enumerator
tak naprawdę jest to tylko opakowanie wokółStepT => IterateeT
, co sugeruje, że musisz „ustąpić” od AStepT[E, BigMonad, A]
.