আমার যদি একটি 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]
যদি এলুমেটর মোনাড পুনরাবৃত্ত মোনাডের চেয়ে "বড়" হয় তবে আমি মেলাতে পুনরাবৃত্তিকে "লিফট" করতে 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বা কোনও সুস্পষ্ট "লিফট" পদ্ধতিরও নেই।
Enumeratorঠিক একটি কার্যকর উত্স, তাই না? মনে হচ্ছে আমার সরবরাহ Aকরা যায় এমন কোনও জিনিস ব্যবহার করতে সক্ষম হওয়া উচিত Task[A]।
Enumeratorসত্যিকার অর্থে কেবল একটি প্রায় একটি মোড়কStepT => IterateeT, যা আপনাকে "পদত্যাগ" করার দরকার বলে প্রস্তাব দেয় থেকে একটিStepT[E, BigMonad, A]।