Scala 类型类,用于获取类型成员的最具体类型

标签 scala scalaz shapeless

考虑以下 Scala 代码:

trait Elem
class MyElem extends Elem

trait Holder {
  type EP <: Elem
  def get: EP
}

class MyHolder(e: MyElem) extends Holder {
  type EP = MyElem
  def get = e
}

取决于我是否输入了一个对象 HolderMyHolder , 调用get可能返回 ElemMyElem , 分别。我正在尝试在类型级别提供该信息,但我没有得到任何结果。例如,考虑 Getter像这样键入类:

trait Getter[From] {
  type Out
  def get(from: From): Out
}

object Getter {
  type Aux[From, Out0] = Getter[From] { type Out = Out0 }

  def apply[From](implicit getter: Getter[From]): Getter.Aux[From, getter.Out] = getter

  // some way to create a `Getter[H <: Holder]`
  // where `Out` is the most specific type known for `H#EC`
}

Getter[MyHolder] // should return a MyHolder { type Out = MyElem }
Getter[Holder] // should return a Holder { type Out = Elem }

我正在尝试为 Getter[H <: Holder] 创建隐式构造函数片段中缺少,但即使我尝试了几种约束类型的方法,我也没有得到任何适用于上述两个示例的结果。

这可能与Scala编译器有关吗?是否有来自 shapeless 的任何类型类别?或 scalaz帮我做吗?

最佳答案

你的问题听起来像是 Path Dependent Types 的应用程序。

其中,您可以在不知 Prop 体实现的情况下根据某些特征/类中定义的类型键入内容:

val x: Holder#EP = ???

我希望这是您正在寻找的,如果不是,恐怕我不完全理解您的问题。

关于Scala 类型类,用于获取类型成员的最具体类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43597325/

相关文章:

scala - 使用或不使用 @transient 序列化惰性 val 时的区别

在 Intellij 中升级到 Scala 2.12 版本后,Scala 类无法加载

Scala 类型签名因子类而失败

java - 在 Java 中解析 scalaz.Validation

scala - 如何自动生成一个函数以将密封的案例类系列与隐式实例相匹配?

scala - 带有无形的类型转换

scala - 调用 toArray 时编译器错误

scala - Spock 参数化与 Scala TableDrivenPropertyChecks

json - 如何使用 argonaut 镜头修改 JSON 中的值和类型?

scala - 从案例类中过滤出一个字段