加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 为什么我不能索引到通过映射到另一个HList获得的HList

发布时间:2020-12-16 18:18:16 所属栏目:安全 来源:网络整理
导读:即使是.head也行不通. 我需要做些什么改变来完成这项工作? import shapeless._import HList._import Nat._scala case class Foo[A](a: A)defined class Fooscala case class Bar[A](f: Foo[A])defined class Barscala val xs = Foo(23) :: Foo("blah") :: H
即使是.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
                    ^

解决方法

完全按照我的书面编写,至少使用最新的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来解决这个问题…显然这更详细,但是c ‘est la vie.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读