2013-04-24 70 views
1

可以說我有一些密封類Scala的方法取決於類型的密封參數

sealed abstract class SomeEnumThing { 
    type RenderedType 
} 
object Type1 extends SomeEnumThing { 
    type RenderedType = String 
} 
object Type2 extends SomeEnumThing { 
    type RenderedType = Array[Byte] 
} 

而且我想的方法基於傳入的參數定義的抽象類型返回,如

def render(something : SomeEnumThing) : something.RenderedType = { .... } 

這是什麼正確的語法。這甚至是可能的,我認爲這與2.10方法相關的類型有關。

編輯:更新了例

sealed abstract class SomeThing { 
    type RenderedType 
} 
object Type1 extends SomeThing { 
    type RenderedType = String 
} 
object Type2 extends SomeThing { 
    type RenderedType = Long 
} 

def render(something : SomeThing) : something.RenderedType = 
    something match { 
    case Type1 => "test" 
    case Type2 => 0l 
} 
+2

你的問題是,你想要案例匹配來介紹新型知識,它並沒有在你的情況。使用GADT和依賴類型時,這可能很容易發生,但在您的情況下不會發生。幸運的是,Scala支持GADT的一個相當絕對的概念,並且你的類型同構於一個類型,所以你可以改變你的'SomeThing'到'SomeThing [A]'並且'Type1 extends SomeThing [String]'並且'Type2 extends SomeThing [龍]'。然後用'render [A](something:SomeThing [A]):你的大小寫塊就會起作用。 – 2013-04-24 21:55:52

+0

因此,你的意思是編譯器不會確定Type1中唯一可能的返回值是一個字符串,這恰好是該情況下RenderedType的值。它可以,如果它足夠聰明,但Scala編譯器還沒有。 – monkjack 2013-04-24 22:05:56

+2

是的,它是那些想要做的更「依賴」的事情之一。在我的例子中,案例匹配是有效的,但我並不太相信它的實現(如果你將兩個類型變量平等,例如,它不能正確工作,或者如果你對精化類型變量有差異註釋) 。如果你真的想開始做這樣的事情,你可能需要將你的代碼從頭開始,並在'SomeThing'上定義消費/消除函數。 – 2013-04-24 22:09:15

回答

0

結構上,你必須在你的例子似乎是正確的,但問題是你會那些省略號裏面做以返回something.RenderedType。我一起扔了一個簡單的impl來檢查所有的東西是否編譯完成(而且確實如此),但就像我說的那樣,它歸結爲render函數內部發生了什麼。這裏是我的代碼:

object RenderedTypeTest { 

    def render(something : SomeEnumThing) : something.RenderedType = { 
    something.renderType 
    } 
} 

sealed abstract class SomeEnumThing { 
    type RenderedType 
    def renderType:RenderedType 
} 
object Type1 extends SomeEnumThing { 
    type RenderedType = String 
    def renderType = "hello" 
} 
object Type2 extends SomeEnumThing { 
    type RenderedType = Array[Byte] 
    def renderType = Array() 
} 
+0

它實際上是一個選項的東西。當我有真正的代碼設置時,它不工作,我確信我在實現方法中是正確的,但我會再次播放並報告回來。 – monkjack 2013-04-24 19:34:57

+0

我已經添加了一個不能編譯的更新示例 - 也許我正在做一些愚蠢的事情。其實這很可能。 – monkjack 2013-04-24 19:58:08

+0

今晚我會給你一個新的代碼。現在在途中。 – cmbaxter 2013-04-24 20:14:53

相關問題