使用无形的协方差问题

时间:2016-07-22 20:41:31

标签: scala shapeless

请考虑以下代码段:

import shapeless.HList

sealed trait Issue[L <: HList] {
  def content: L
  def withT[T](t: T): Issue[T :: L]
}

private case class IssueImpl[L <: HList](content: L) extends Issue[L] {
  def withT[T](t: T)(implicit ev: SomeEvidenceRegardingT[T]): Issue[T :: L] =
    IssueImpl(t :: content)
}

我在这里尝试实现的是建立一个基于HList的结构,同时限制HList中可以放置的内容(因此附加到withT的证据)

问题是Scala编译器抱怨IssueImpl[T :: L]不符合类型Issue[T :: L],但我不能在特征Issue中使L协变,因为L出现在不变位置。< / p>

有没有办法实现Issue的合理实施?还是有另一种方法更适合我想做的事情吗?

感谢任何指针。

1 个答案:

答案 0 :(得分:1)

我被错误消息误导:这里的问题是::实际上是scala.::而不是shapeless.::(它没有导入,只有HList是)。

所以解决方案是

import shapeless.{HList, ::}

HList协方差按预期工作。