【问题标题】:Why can't I index into an HList obtained by mapping over another HList?为什么我不能索引到通过映射另一个 HList 获得的 HList?
【发布时间】:2012-06-26 23:58:26
【问题描述】:

即使.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
                    ^

【问题讨论】:

    标签: scala shapeless


    【解决方案1】:

    至少在最新的 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))
    

    请注意,上面为 res0 推断的类型是 Bar[Int] :: Bar[String] :: HNil 而不是 mapper.Out ...我怀疑这是 2.9.x 和 2.10.0-SNAPSHOT 之间的行为差​​异。

    如果您坚持使用 2.9.x,那么我认为您应该能够通过明确地将 Bar[Int] :: Bar[String] :: HNil 归属于您的 res13 来解决该问题......显然这更冗长,但这是生活。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 2015-12-03
      • 2017-04-22
      • 2023-03-04
      • 1970-01-01
      • 2017-02-10
      相关资源
      最近更新 更多