2013-10-18 6 views
21

में एक विभाजन को उठाना शायद मुझे कुछ स्पष्ट याद आ रही है, लेकिन मैं स्कालाज़ 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 में पहले से ही किए गए कार्यों और उदाहरणों के साथ इसे और अधिक स्पष्ट रूप से लिखना संभव हो जाएगा?

उत्तर

3

ट्विटर in response to this question से Lars Hupel के शब्दों में:

मुझे नहीं पता कि यह करना चाहिए था जो हमारे bimap है या क्या है।

और:

संबंधित: BijectionT की T हिस्सा शायद गलत है। इसे शायद हास्केल संस्करण की तरह दिखने के लिए फिर से लिखा जाना चाहिए।

तो उत्तर स्पष्ट रूप से नहीं है, मुझे कुछ भी याद नहीं आया - यह वास्तव में वर्तमान एपीआई में एक अंतर है जो शायद भविष्य में स्कालज़ संस्करण में तय किया जाएगा।

संबंधित मुद्दे