2013-04-24 39 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

相关问题