scala - 同时获得见证人和类型类

标签 scala typeclass shapeless

我正在尝试包含类型参数的单例类型。我正在尝试编写一个函数,该函数将接受该单例类型的见证人和其嵌套类型的类型类。单独获取每一个都很容易(请参阅下面的 f1()f2()),但我无法让它同时工作:

import shapeless._
import shapeless.labelled.FieldType
import shapeless.syntax.singleton._

sealed trait TC[L]

object TC {
  implicit def intTC = new TC[Int] {}
}

object Test {
  def f1[VI <: Vector[Int]](value: FieldType[VI, String])(
                            implicit wt: Witness.Aux[VI]) = {}

  def f2[L](value: FieldType[_ <: Vector[L], String])(
            implicit wt: TC[L]) = {}

  def f3[L, M <: Vector[L]](value: FieldType[M, String])(
                            implicit wt: TC[L], witness: Witness.Aux[M]) = {}

  val v = Vector(1,2,3)
  f1(v ->> "foo")    // works
  f2(v ->> "foo")    // works
  f3(v ->> "foo")    // does not work
}

我正在获取

inferred type arguments [Nothing,Test.v.type] do not conform to method f3's type parameter bounds [L,M <: Vector[L]]
[error]   f3(v ->> "foo")

有没有办法帮助编译器同时推断内部类型和单例类型?

最佳答案

以下内容对我有用。我添加了一个隐式参数 ev,它提供了 MVector[L] 子类的证据,并将它们绑定(bind)在一起。这足以防止编译器推断 LNothing

def f3[L, M <: Vector[_]](value: FieldType[M, String])(
                          implicit witness: Witness.Aux[M],
                                   ev: M <:< Vector[L], 
                                   wt: TC[L]) = {}

关于scala - 同时获得见证人和类型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48045493/

相关文章:

scala - 以 Nat 表示的 List 类型参数的长度

scala - 副产品的运行时成本?

scala - 从 Kafka 主题读取数据并使用 scala 和 spark 写回 Kafka 主题

Scala 宏 : Define Top Level Object

scala - 为什么运营商的变化?

scala - 在 Scala 中实现产品类型,并在其各个部分上使用通用更新功能

scala - Haskell v. Scala 中的类型类

scala - 获取字段键作为副产品

scala - 我可以使用绑定(bind)在 Scala 值类中的 View 吗?

haskell - 对类型类约束感到困惑