HList

2012-07-11 21 views
6

पर मैप करने के लिए असमर्थ मैं निराकार साथ this problem हल करने के लिए कोशिश कर रहा था। हालांकि मैं किसी कारण HList पर मैप करने के लिए असमर्थ के लिए कर रहा हूँ। मैं कोड खुद के लिए बोलने दूँगा।HList

import shapeless._ 
import HList._ 

case class Foo(a: Option[Int], b: Option[Int]) 

val a = Foo(Some(3), None) 

val b = Foo(Some(22), Some(1)) 

implicit val fooIso = HListIso(Foo.apply _, Foo.unapply _) 

val mapper = new (({ type O2[+A] = (Option[A], Option[A]) })#O2 ~> Option) { 
    def apply[A](x: (Option[A], Option[A])): Option[A] = x._1.orElse(x._2) 
} 

fooIso.fromHList(fooIso.toHList(a).zip(fooIso.toHList(b)).map(mapper)) 

त्रुटि संदेश है:

<console>:55: error: could not find implicit value for parameter mapper: shapeless.Mapper[java.lang.Object with shapeless.~>[[+A](Option[A], Option[A]),Option],shapeless.::[(Option[Int], Option[Int]),shapeless.::[(Option[Int], Option[Int]),shapeless.HNil]]] 
       fooIso.fromHList(fooIso.toHList(a).zip(fooIso.toHList(b)).map(mapper)) 
                     ^

क्यों नहीं मानचित्रण काम करता है?

उत्तर

10

एक आसान ठीक है:

object f extends (({ type O2[+A] = (Option[A], Option[A]) })#O2 ~> Option) { 
    def apply[A](x: (Option[A], Option[A])): Option[A] = x._1 orElse x._2 
} 

(ध्यान दें कि मैं समारोह mapper के बजाय fmapper निहित करने के लिए तर्क के साथ भ्रम से बचने के नाम पर रखा गया है: सिर्फ एक object एक val के बजाय के रूप में अपने समारोह को परिभाषित map।)

मुझे यकीन है कि क्यों कुछ बिंदु कम से मैं क्यों val निराकार में बात इस तरह का काम नहीं होगा का विवरण बाहर काम करने की कोशिश की मैं साथ मदद कर सकते हैं नहीं कर रहा हूँ, और मैं याद नहीं है कि मुझे कितना दूर मिला।

+8

poly1 (और इसलिए ~>) के कार्यान्वयन, परिभाषित किया जा रहा के रूप में परिभाषित किया जा रहा है एक सिंगलटन प्रकार समारोह की तरह इकाई के लिए इसी नाम के लिए सक्षम किया जा रहा पर निर्भर करता है। यह सुचारू रूप से जहां उस संस्था एक वस्तु है और मूल्य एक स्थिर पहचानकर्ता के निर्माण के साथ एक साथ instantiated है के माध्यम से चला जाता है, लेकिन ऐसा नहीं सुचारू रूप से जहां उन दोनों (वैल परिभाषा के माध्यम से एक स्थिर पहचानकर्ता के एक स्पष्ट नए और सृजन के माध्यम से इन्स्टेन्शियशन) अलग होती है इस भावना के कुछ प्रकार बनाता है, लेकिन मैं कल्पना में पाठ को न्यायोचित ठहरा को इंगित नहीं कर सकते हैं ... अगर कोई और कर सकता है, कृपया मुझे बताएं। –