में एक विभाजन को उठाना शायद मुझे कुछ स्पष्ट याद आ रही है, लेकिन मैं स्कालाज़ 7 का उपयोग करने वाली एक परियोजना में कुछ बॉयलरप्लेट को साफ़ करने की कोशिश कर रहा हूं, और मुझे एक विशेष पहेली टुकड़ा नहीं मिल रहा है जो बहुत आसान लगता है और संभवतः उपयोगीएक मज़ेदार
मान लीजिए हम दो प्रकार के बीच एक द्विभाजन है:
case class Foo(x: Int)
case class Bar(i: Int)
import scalaz._, Scalaz._, BijectionT._
val fb: Foo <@> Bar = bijection[Id, Id, Foo, Bar](
foo => Bar(foo.x),
bar => Foo(bar.i)
)
अब हम पाते हैं कि हम List[Foo]
और List[Bar]
जो द्विभाजन की जरूरत है लगता है।
implicit class BijectionLifter[A, B](val bij: A <@> B) extends AnyVal {
def liftInto[F[_]: Functor]: F[A] <@> F[B] = bijection[Id, Id, F[A], F[B]](
_ map bij.to,
_ map bij.from
)
}
ध्यान दें कि यह हास्केल के Data.Bijection
से bimap
का एक सीधा अनुवाद है: हम आसानी से (हम साथ ही यह किसी भी functor के लिए काम कर सकते हैं वास्तव में) एक अंतर्निहित वर्ग है कि इस सुविधा प्रदान करता है लिख सकते हैं। स्कालाज़ के विभाजन में bimap
नामक एक विधि भी है, लेकिन इसमें बहुत व्यस्त प्रकार है और ऐसा लगता है कि मैं किसी भी स्पष्ट तरीके से नहीं चाहता हूं।
अब हम सिर्फ निम्नलिखित लिख सकते हैं:
fb.liftInto[List]
और हम द्विभाजन हम की जरूरत मिल गया है।
क्या मुझे कुछ अमूर्तता याद आ रही है जिससे स्कालज़ 7 में पहले से ही किए गए कार्यों और उदाहरणों के साथ इसे और अधिक स्पष्ट रूप से लिखना संभव हो जाएगा?