2012-06-26 20 views
5

यहां तक ​​कि .head काम नहीं करता है।मैं किसी अन्य एचएलआईस्ट पर मैपिंग द्वारा प्राप्त एचएलिस्ट में क्यों नहीं भेज सकता?

मुझे यह काम करने के लिए क्या परिवर्तन करने की आवश्यकता है?

import shapeless._ 
import HList._ 
import Nat._ 

scala> case class Foo[A](a: A) 
defined class Foo 

scala> case class Bar[A](f: Foo[A]) 
defined class Bar 

scala> val xs = Foo(23) :: Foo("blah") :: HNil 
xs: shapeless.::[Foo[Int],shapeless.::[Foo[java.lang.String],shapeless.HNil]] = Foo(23) :: Foo(blah) :: HNil 

scala> object mapper extends (Foo ~> Bar) { 
    | def apply[A](f: Foo[A]) = Bar(f) 
    | } 
defined module mapper 

scala> xs map mapper 
res13: mapper.Out = Bar(Foo(23)) :: Bar(Foo(blah)) :: HNil 

scala> res13.apply[_1] 
<console>:38: error: could not find implicit value for parameter at: shapeless.At[mapper.Out,shapeless.Nat._1] 
       res13.apply[_1] 
         ^

scala> res13.head 
<console>:38: error: could not find implicit value for parameter c: shapeless.IsHCons[mapper.Out] 
       res13.head 
        ^

उत्तर

6

मेरे लिए काम करता है वास्तव में लिखा के रूप में, कम से कम नवीनतम 2.10.0-स्नैपशॉट,

import shapeless._ 
import HList._ 
import Nat._ 

scala> case class Foo[A](a: A) 
defined class Foo 

scala> case class Bar[A](f: Foo[A]) 
defined class Bar 

scala> val xs = Foo(23) :: Foo("blah") :: HNil 
xs: shapeless.::[Foo[Int],shapeless.::[Foo[String],shapeless.HNil]] = Foo(23) :: Foo(blah) :: HNil                          

scala> object mapper extends (Foo ~> Bar) { 
    | def apply[A](f: Foo[A]) = Bar(f)                                        
    | }                                                
defined module mapper                                             

scala> xs map mapper                                             
res0: shapeless.::[Bar[Int],shapeless.::[Bar[String],shapeless.HNil]] = Bar(Foo(23)) :: Bar(Foo(blah)) :: HNil                       

scala> res0[_1] 
res1: Bar[String] = Bar(Foo(blah))                                          

scala> res0.head                                              
res2: Bar[Int] = Bar(Foo(23)) 

सूचना है कि प्रकार res0 लिए लगाए गए अनुमान के साथ ऊपर Bar[Int] :: Bar[String] :: HNil बजाय mapper.Out है ... मुझे लगता है यह 2.9.x और 2.10.0-स्नैपशॉट के बीच व्यवहार में एक अंतर है।

यदि आप 2.9.x के साथ फंस गए हैं तो मुझे लगता है कि आप Bar[Int] :: Bar[String] :: HNil को अपने res13 पर स्पष्ट रूप से बताकर समस्या के आसपास काम करने में सक्षम होना चाहिए ... जाहिर है कि यह अधिक verbose है, लेकिन c'est la vie।