2012-06-26 11 views
5

.head çalışmıyor.Neden başka bir HList üzerinde haritalama ile elde edilen bir HList'e endeksleyemiyorum?

Bu işi yapmak için hangi değişiklikleri yapmaya ihtiyacım var?

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 
        ^

cevap

6

benim için Works aynen yazıldığı gibi, en azından tip res0 bilgilerin tahmin olduğunu son 2.10.0-SNAPSHOT,

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)) 

Bildirimi ile yukarıda sanıyorum ... Bar[Int] :: Bar[String] :: HNil ziyade mapper.Out olduğunu Bu, 2.9.x ve 2.10.0-SNAPSHOT arasındaki davranış farkıdır.

Eğer 2.9.x ile sıkışmış iseniz o zaman ben Bar[Int] :: Bar[String] :: HNilres13 için atlayarak sorun etrafında çalışabilmeniz gerektiğini düşünüyorum ... açıkçası bu daha fazla verbose, ama c'est la vie.