अगर मेरे पास एक 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, जो बताता है कि आपको "पद छोड़ने" की आवश्यकता होगी a सेStepT[E, BigMonad, A]।