2017-04-24 33 views
4

考虑下面的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可能会返回一个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编译器有关吗? shapelessscalaz的任何类型的课程能帮我做到吗?

回答

0

什么你问听起来像是Path Dependent Types

的应用,其中,您可以键入基于某些特质/类中定义的类型的东西不知道具体的实现:

val x: Holder#EP = ??? 

我希望这是你在找什么,如果不是,恐怕我不完全理解你的问题。

+0

嗨查尔斯。我已经想过使用路径依赖类型,可以用它来解决问题中的问题。不幸的是,他们不会在我的具体问题上工作,因为它比我在这里给出的例子稍微复杂一些。尽管如此,如果您提供了针对上述问题的实施方案并加以简要说明,我愿意在此接受您的答案。 –