2011-05-12 15 views
4

を簡素化するために使用を強調する:私は最後の文を簡素化しようとしたScalaは、私は次のコードを持つ関数リテラルの構文

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 _) 

私はこれらのことについてもっと読むことをあなたに任せます(コレクションや折り目の最小の方法;これらはあなたが書いたものほど速くはないことに注意してください)。

問題は、アンダースコアを書くときにどのような有効な型があるのか​​と、関数を記述しようとしていると思われる型情報を追加するときにコンパイラが失われてしまうことです。があり、mに割り当ててください。しかし、もちろんmIntであり、関数ではないので、それは文句を言う。

明示的に書いてください。いくつかの余分な文字があります:

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

ありがとうRex!私はアンダースコアを使って式を単純化する詳細を理解しようとしていました。あなたの解:val m =(Int.MaxValue /:x)(_ min _)は、とても素敵です!乾杯! – Stan

関連する問題