Wenn ich ein EnumeratorTund ein entsprechendes IterateeThabe, kann ich sie zusammen ausführen:
val en: EnumeratorT[String, Task] = EnumeratorT.enumList(List("a", "b", "c"))
val it: IterateeT[String, Task, Int] = IterateeT.length
(it &= en).run : Task[Int]
Wenn die Enumerator-Monade "größer" als die Iteratee-Monade ist, kann ich die Iteratee verwenden upoder allgemeiner Hoist"anheben", um sie anzupassen:
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]
Aber was mache ich, wenn die iterierte Monade "größer" ist als die Enumerator-Monade?
val en: EnumeratorT[String, Id] = ...
val it: IterateeT[String, Task, Int] = ...
it &= ???
Es scheint weder eine HoistInstanz EnumeratorTnoch eine offensichtliche "Lift" -Methode zu geben.
Enumeratornur eine wirksame Quelle, oder? Es fühlt sich so an, als ob ich in der Lage sein sollte, etwas zu verwenden, das liefern kann, um Azu liefern Task[A].
Enumeratorwirklich nur ein Wrapper um a istStepT => IterateeT, was darauf hindeutet, dass Sie "zurücktreten" müssen. von aStepT[E, BigMonad, A].