अगर मेरे पास एक 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]
।