考虑以下 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
可能返回 Elem
或 MyElem
, 分别。我正在尝试在类型级别提供该信息,但我没有得到任何结果。例如,考虑 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/