Nếu tôi có một EnumeratorTvà tương ứng, IterateeTtôi có thể chạy chúng cùng nhau:
val en: EnumeratorT[String, Task] = EnumeratorT.enumList(List("a", "b", "c"))
val it: IterateeT[String, Task, Int] = IterateeT.length
(it &= en).run : Task[Int]
Nếu đơn vị liệt kê "lớn hơn" đơn vị iteratee, tôi có thể sử dụng uphoặc nói chung hơn là Hoist"nâng" iteratee để khớp:
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]
Nhưng tôi phải làm gì khi đơn vị iteratee "lớn" hơn đơn vị liệt kê?
val en: EnumeratorT[String, Id] = ...
val it: IterateeT[String, Task, Int] = ...
it &= ???
Dường như không có một Hoiství dụ nào EnumeratorT, cũng không có bất kỳ phương pháp "nâng" rõ ràng nào.
Enumeratorthì chỉ là một nguồn hiệu quả, phải không? Cảm giác như tôi có thể sử dụng một thứ có thể cung cấp Ađể cung cấp Task[A].
Enumeratorthực sự chỉ là một trình bao bọc xung quanh aStepT => IterateeT, điều đó cho thấy bạn sẽ cần phải "từ chức" từ aStepT[E, BigMonad, A].