2012-06-26 11 views
5

でも.headは機能しません。別のHListにマッピングして得たHListにインデックスを付けることができないのはなぜですか?

この変更を行うには、どのような変更が必要ですか?

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-SNAPSHOTと書かれたとおりに私の作品、上記res0のために推論種類がBar[Int] :: Bar[String] :: HNilいうよりmapper.Outであることを

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

お知らせ...これは2.9.xと2.10.0-SNAPSHOTの間の動作の違いです。

2.9.xに固執している場合は、Bar[Int] :: Bar[String] :: HNilres13に明示的に帰属させることで問題を回避できるはずです。明らかにもっと冗長ですが、c'est la vie。

関連する問題