2017-04-24 71 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

嗨查爾斯。我已經想過使用路徑依賴類型,可以用它來解決問題中的問題。不幸的是,他們不會在我的具體問題上工作,因爲它比我在這裏給出的例子稍微複雜一些。儘管如此,如果您提供了針對上述問題的實施方案並加以簡要說明,我願意在此接受您的答案。 –