2014-03-18 114 views
1

以下爲什麼類型推斷失敗,SEQ#收集在這種情況下

List(1, 2, 3).collect { x => 
    val dummy =() 
    x match { case _ => x } 
} 

結果

<console>:9: error: missing parameter type 
        List(1, 2, 3).collect { x => 

但這種看似相同的片段按預期工作:

List(1, 2, 3).collect { x => 
    x match { case _ => x } 
} 

這是真的該collect需要PartialFunction,但我看到這一點的方式是,如果{ x => x match { ... } }PartialFunction(它必須歸因於編譯器中的特殊情況,因爲它看起來就像是一個正常函數throws MatchError),那麼{ x => smth(); x match { ... } }也應該是PartialFunction。 (編輯:我不知道,甚至第一案被推斷爲一個PartialFunction

+0

的值,以及爲什麼你需要平穩()?順便說一句,你可以看看這篇[關於Scala中的部分函數的文章](http://www.scala-sbt.org/0.13.1/docs/Getting-Started/Library-Dependencies.html#resolvers)。 –

+0

其實我需要做'smth - > x match {...}'這樣我就不必重複'match'的每個case中構造'smth'了;或者,我可以把它放在'val'中並在'case'中重複使用,但結果相同; (但文章是關於SBT的;你的剪貼板對你的玩弄技巧:)) –

+0

不客氣:) 我不知道你的用例到底是什麼,但你可以嘗試像這樣:list.map( x => smth(x))。collect。 E.g. (list =「1」,「2」,「33」) list.map(elem => elem.toInt).collect(_ match {case x:Int if x> 2 => x}) 這:a)將每個字符串轉換爲int(您的smth()函數),b)收集> 2的整數。 –

回答

2

這種行爲在斯卡拉規範中部分8.5 Pattern Matching Anonymous Functions描述。

總之這意味着表達{x => x match { case ... => ... } },這是一個匿名函數,隱式轉換爲一個PartialFunctionPartialFunction預期的,因爲它是用於collect的情況。

表達

{ x => 
    val dummy =() 
    x match { case _ => x } 
} 

是不同的形狀,因此不隱式轉換。它被視爲A => B類型,因爲它需要A類型的價值和它的體內含有兩個表達式,即val dummy =()x match { case _ => x }其中後者生產型B

+0

好的,這就是我所懷疑的。 –

+0

我不知道規範是否說明了這一點。它說'{case =>}'塊是一個PMAF,並且它說大小寫塊「等價於」相應的func或PF,但從來沒有(因爲它是傳遞性的)func等同於PF。但代碼評論明確表示它打算這麼做。我發現他們確實爲[vpm]工作,從uncurry轉向typer。這在Scala書中沒有提及。 –

+0

@ som-snytt:我同意,規範並不完全明確地回答這個問題。另一方面,這是規範中很多事情的情況。 – sschaef

相關問題