আমার যদি একটি 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]
।