2011-05-12 22 views
4

我有以下代碼:斯卡拉強調使用簡化函數文本的語法

var x = Array(1,3,4,4,1,1,3) 
var m = Int.MaxValue 
x.foreach((x)=>(m = m min x)) 

我想最後一句簡化爲:

x.foreach((m = _ min m)) 

但解釋說:

scala> x.foreach((m = _ min m))  
<console>:8: error: missing parameter type for expanded function ((x$1) => x$1.min(m)) 
    x.foreach((m = _ min m)) 
       ^

我試圖更加明確的類型:

scala> x.foreach((m = (_:Int) min m)) 
<console>:8: error: type mismatch; 
found : (Int) => Int 
required: Int 
    x.foreach((m = (_:Int) min m)) 
         ^

編譯器,我不明白對方:(

最好的問候,

斯坦

+0

看起來'='正在分隔表達式。我沒想到會發生這種情況......而且我測試了代碼,但它顯然不起作用,所以我刪除了我的答案。 –

回答

3

首先,請注意

val m = x.min 

你想要做什麼,

val m = (Int.MaxValue /: x)(_ min _) 

我會留給你閱讀更多關於這些東西(關於收藏的最小方法和摺疊;注意這些不如你寫的那麼快)。

問題在於,編譯器迷失於你的意思,以及在編寫下劃線時使用什麼有效類型,以及何時添加類型信息,認爲您正在嘗試編寫函數right有並將其分配給m。但當然m是一個Int,而不是一個函數,所以它抱怨。

只需明確寫下。這只是一些額外的字符:

x.foreach(i => m = m min i) 
+0

謝謝雷克斯!我試圖理解使用下劃線簡化表達式的細節,而不是計算最小值。您的解決方案:val m =(Int.MaxValue /:x)(_ min _),非常整齊!乾杯! – Stan