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

时间:2017-04-24 20:39:25

标签: 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
}

根据我输入的对象是Holder还是MyHolder,调用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编译器有关吗? shapelessscalaz中的任何类型类都可以帮助我这样做吗?

1 个答案:

答案 0 :(得分:0)

您所询问的内容听起来像是Path Dependent Types

的应用

其中,您可以根据某些特征/类中定义的类型键入内容,而无需了解具体实现:

val x: Holder#EP = ???

我希望这是你正在寻找的,如果不是,我担心我不完全理解你的问题。