Si j'ai un EnumeratorTet un correspondant, IterateeTje peux les exécuter ensemble:
val en: EnumeratorT[String, Task] = EnumeratorT.enumList(List("a", "b", "c"))
val it: IterateeT[String, Task, Int] = IterateeT.length
(it &= en).run : Task[Int]
Si la monade énumératrice est "plus grosse" que la monade itérée, je peux utiliser upou, plus généralement, Hoist"lever" l'itérée pour qu'elle corresponde:
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]
Mais que dois-je faire lorsque la monade itérative est "plus grosse" que la monade énumératrice?
val en: EnumeratorT[String, Id] = ...
val it: IterateeT[String, Task, Int] = ...
it &= ???
Il ne semble pas y avoir d' Hoistexemple EnumeratorTni de méthode de "lift" évidente.
Enumeratorc'est juste une source efficace, non? J'ai l'impression que je devrais pouvoir utiliser une chose qui peut fournir Aà fournir Task[A].
Enumeratorest vraiment juste un wrapper autour d'unStepT => IterateeT, ce qui suggère que vous devrez "démissionner" d'unStepT[E, BigMonad, A].