451

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]

しかし、反復モナドが列挙子モナドよりも「大きい」場合はどうすればよいでしょうか?

val en: EnumeratorT[String, Id] = ...
val it: IterateeT[String, Task, Int] = ...

it &= ???

HoistのインスタンスEnumeratorTも、明らかな「リフト」メソッドもないようです。

4

1 に答える 1