2

在斯卡拉2.10.0-M4爲什麼Scala 2.10在匹配singleton類型時給出'匹配可能不完全'的警告?

object X 
def f(e: Either[Int, X.type]) = e match { 
    case Left(i) => i 
    case Right(X) => 0 
} 

給出:

warning: match may not be exhaustive. 
It would fail on the following input: Right(<not X>) 

這是正確的嗎?當然這場比賽實際上是詳盡無遺的。

(與此同時,在斯卡拉2.9.X我們得到

error: pattern type is incompatible with expected type; 
found : object X 
required: X.type 
      case Right(X) => 0 

這大概是一個錯誤。)

+0

這似乎喜歡的類型檢查不在這種情況下區分單類型從普通的類型。 反正我猜你應該知道Right(_)上的匹配也是安全的,因爲Right只能是X.type類型,對吧? – Kaito

+0

是的,這是我的'解決方法'。 –

+0

打開一個bug報告它可能不是一個bug,但是儘管如此,窮舉檢查是Scala 2.10上的最新代碼,這只是我想像的Adriaan所期望的反饋。 –

回答

5

可悲的是,還有一些居住在X.type兩個值。一個是明顯的,X,另一個當然是null。因此,你的模式已經錯過的情況下:(

+1

雖然正確,但這是類型的東西克爾克通常會忽略,因爲每次都必須考慮它。他可以在Right(_)上匹配,如果傳遞null,仍然會出現匹配錯誤,這次沒有來自編譯器的警告。 – Kaito

+0

事實上,編譯器並不在意沒有'case null => ...',因爲它忽略了密封類的可能性。但是,當編譯器進入窮舉檢查模式時,顯然(我對此並不積極!),它也會檢查所有的子模式。我想你可以稱之爲一個bug:/ – mergeconflict

+1

在我的測試中,當傳遞Right(null)時也會引發匹配錯誤,即使您不嘗試訪問內容。使用非密封類給出相同的行爲,沒有警告和匹配錯誤。 對我來說,編譯器不會提醒我這件事似乎很正常。 GHC也沒有警告底部。 – Kaito