EnumeratorT
と対応するものがあれば、IterateeT
一緒に実行できます:
val en: EnumeratorT[String, Task] = EnumeratorT.enumList(List("a", "b", "c"))
val it: IterateeT[String, Task, Int] = IterateeT.length
(it &= en).run : Task[Int]
列挙モナドがiterateeモナドよりも「大きい」場合、私は一致するようにiterateeを使用するup
か、より一般的にHoist
は「持ち上げ」ます。
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]
しかし、iterateeモナドが列挙子モナドよりも「大きい」場合、どうすればよいでしょうか。
val en: EnumeratorT[String, Id] = ...
val it: IterateeT[String, Task, Int] = ...
it &= ???
のHoist
インスタンスEnumeratorT
も、明らかな「リフト」メソッドもないようです。
Enumerator
は効果的な情報源ですよね?供給できるものを供給A
に使えるようになった気がしますTask[A]
。
Enumerator
実際にはがのラッパーにすぎないため、これが一般的なケースで可能かどうか頭からはわかりませStepT => IterateeT
ん。からStepT[E, BigMonad, A]
。