cats में, जब एक मोनाड Monad
विशेषता का उपयोग करके बनाया गया है, विधि tailRecM
के लिए एक कार्यान्वयन प्रदान किया जाना चाहिए।बिल्लियों: मोनाड्स के लिए गैर पूंछ रिकर्सिव tailRecM विधि
मैं मैं tailRecM
sealed trait Tree[+A]
final case class Branch[A](left: Tree[A], right: Tree[A]) extends Tree[A]
final case class Leaf[A](value: A) extends Tree[A]
implicit val treeMonad = new Monad[Tree] {
override def pure[A](value: A): Tree[A] = Leaf(value)
override def flatMap[A, B](initial: Tree[A])(func: A => Tree[B]): Tree[B] =
initial match {
case Branch(l, r) => Branch(flatMap(l)(func), flatMap(r)(func))
case Leaf(value) => func(value)
}
//@tailrec
override def tailRecM[A, B](a: A)(func: (A) => Tree[Either[A, B]]): Tree[B] = {
func(a) match {
case Branch(l, r) =>
Branch(
flatMap(l) {
case Right(l) => pure(l)
case Left(l) => tailRecM(l)(func)
},
flatMap(r){
case Right(r) => pure(r)
case Left(r) => tailRecM(r)(func)
}
)
case Leaf(Left(value)) => tailRecM(value)(func)
case Leaf(Right(value)) => Leaf(value)
}
}
}
1) ऊपर के उदाहरण के अनुसार की एक पूंछ पुनरावर्ती कार्यान्वयन प्रदान करने के लिए असंभव पाया कि नीचे एक परिदृश्य है, कैसे इस tailRecM
विधि flatMap
विधि कॉल के अनुकूलन के लिए इस्तेमाल किया जा सकता? संकलन समय पर flatMap
विधि का कार्यान्वयन tailRecM
द्वारा ओवरराइड/संशोधित किया गया है?
2) यदि tailRecM
ऊपर की तरह पूंछ रिकर्सिव नहीं है, तो क्या यह अभी भी मूल flatMap
विधि का उपयोग करने से प्रभावी होगा?
कृपया अपने विचार साझा करें।
उत्तर देने के लिए बहुत बहुत धन्यवाद। मुझे लगता है कि आपने मेरे दूसरे प्रश्न का उत्तर दिया है। पहले के बारे में कोई विचार? –
@tharindu_DG ने बिल्लियों के टिकटों के कुछ लिंक जोड़े –