2017-03-08 60 views
1

使用SBT瘋瘋癲癲的插件:斯卡拉Dotty聯盟類型?

addSbtPlugin("com.felixmulder" % "sbt-dotty" % "0.1.9") 

和運行sbt console,我嘗試新的聯合類型的功能:

Starting dotty interpreter... 
Welcome to Scala.next (pre-alpha, git-hash: 606e36b) (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_112). 
Type in expressions to have them evaluated. 
Type :help for more information. 
scala> case class A(val x: Int, y: Double) 
defined class A 
scala> case class B(val x: Int, y: String) 
defined class B 
scala> def getX(o: A | B): Int = o.x 
-- [E008] Member Not Found Error: <console> ------------------------------------ 
8 |def getX(o: A | B): Int = o.x 
    |       ^^^ 
    |       value `x` is not a member of (A | B)(o) 

爲什麼不這項工作?我使用聯合類型是否錯誤?這只是沒有工作?

回答

-1

我不認爲這應該是實際工作。它確實工作,如果AB延長斷言一個共同的接口他們每個人都有一個x: Int

trait C { def x: Int } 

case class A(x: Int, y: Double) extends C 

case class B(x: Int, y: String) extends C 

def getX(o: A | B): Int = o.x 

scala> getX(A(1, 2)) 
val res0: Int = 1 

沒有它,編譯器將需要反思一下AB,以確定它們是否具有相同的x定義,這似乎不符合簡化Scala類型系統的目標。

當然,支持文檔幾乎不存在,此時沒有完整的規範。我認爲this slide可能是混淆的來源,因爲它不是可編譯的代碼。

+0

那個DarkDimius幻燈片是我混亂的根源。謝謝。 – clay