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

scala – 基于类的类型参数的Poly1方法中的HList映射

发布时间:2020-12-16 18:18:28 所属栏目:安全 来源:网络整理
导读:我有类,用HList和其他类型参数化.如何在其中一个方法中使用HList上的map? 编译此代码会抛出java.lang.AssertionError: class Test[L : HList,P](l: L,p: P) { type Cont[T] = (P,T) object generator extends (Id ~ Cont) { def apply[T](t: T) = p - t }
我有类,用HList和其他类型参数化.如何在其中一个方法中使用HList上的map?

编译此代码会抛出java.lang.AssertionError:

class Test[L <: HList,P](l: L,p: P) {
  type Cont[T] = (P,T)
  object generator extends (Id ~> Cont) {
    def apply[T](t: T) = p -> t
  }
  def test(implicit m: Mapper[generator.type,L]) = {
    l map generator
  }
}

new Test(1 :: HNil,'a).test // java.lang.AssertionError

我的目标是这样的结果:

type Cont[T] = (Symbol,T)
val p = 'a
object generator extends (Id ~> Cont) {
  def apply[T](t: T) = p -> t
}

scala> (1 :: 'b' :: HNil) map generator
res0: shapeless.::[(Symbol,Int),shapeless.::[(Symbol,Char),shapeless.HNil]] = ('a,1) :: ('a,b) :: HNil

解决方法

这是Scala编译器中的一个错误(2.9.2和2.10.0-RC1).

作为一种解决方法,如果您将Test实例的创建和测试方法的调用分成两个表达式,那么它将按预期工作,

scala> val t = new Test(1 :: HNil,'a)
t: Test[shapeless.::[Int,shapeless.HNil],Symbol] = Test@4b153b34

scala> t.test
res0: shapeless.::[(Symbol,shapeless.HNil] = ('a,1) :: HNil

(编辑:李大同)

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

    推荐文章
      热点阅读