2012-06-26 16 views
5

Thậm chí .head không hoạt động.Tại sao tôi không thể lập chỉ mục vào một HList thu được bằng cách ánh xạ trên một HList khác?

Tôi cần phải thực hiện những thay đổi gì để thực hiện công việc này?

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 
        ^

Trả lời

6

trình cho tôi một cách chính xác, ít nhất là với các mới nhất 2.10.0-THÔNG SỐ CHUNG,

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

Chú ý rằng kiểu suy ra cho res0 trên là Bar[Int] :: Bar[String] :: HNil hơn mapper.Out ... Tôi nghi ngờ rằng đây là sự khác biệt trong hành vi giữa 2.9.x và 2.10.0-SNAPSHOT.

Nếu bạn đang mắc kẹt với 2.9.x thì tôi nghĩ bạn sẽ có thể giải quyết vấn đề bằng cách mô tả Bar[Int] :: Bar[String] :: HNil đến res13 của bạn rõ ràng ... rõ ràng là tiết hơn, nhưng c'est la vie.

Các vấn đề liên quan