Wenn ich ein EnumeratorT
und ein entsprechendes IterateeT
habe, 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 up
oder 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 Hoist
Instanz EnumeratorT
noch eine offensichtliche "Lift" -Methode zu geben.
Enumerator
nur 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 A
zu liefern Task[A]
.
Enumerator
wirklich nur ein Wrapper um a istStepT => IterateeT
, was darauf hindeutet, dass Sie "zurücktreten" müssen. von aStepT[E, BigMonad, A]
.