2016-05-31 5 views
0

リストのエントリをnumに近づける方法でリストをソートしようとしています。`_`のパラメータタイプがありません

私が使用sortWithを試してみることにしましたが、次のスニペット:

list.sortWith(math.abs(_ - num) < math.abs(_ - num)) 

は、Scalaでは_のための不足しているパラメータの型で失敗しました。 リストのタイプはList[Int]です。

他のスレッドに続いて、私は(と、なぜ次のコードは、あいまいなタイプではない)、_は何とかあいまいなタイプですが、私はなぜわからないことを知っている:

scala> val sortedDudes = dudes.sortWith(_.name < _.name) 
sortedDudes: Array[Person] = Array(Al, Paul, Tyler) 

Source

+0

コードを自己完結型にします。 'list'と' num'とは何ですか? – Jubobs

+0

listはList [Int]であり、numは任意の整数です。 – dcheng

+1

'math.abs(_ - num)'は 'math.abs(x => x-num)'の略語であり、常に意味がありません。意図されました。 –

答えて

3
def foo = { 
    val num = 2 
    val list: List[Int] = List(1, 2) 
    list.sortWith((a, b) => math.abs(a - num) < math.abs(b - num)) 
    } 

が完全に機能します。スカラは、_math.absからsortWithではなく

1

から得ることができるからです。_はさまざまな状況でさまざまなことを意味するために使用できます。 this questionの回答は、それらのいくつかを明確にするのに役立ちます。

質問に戻ると、OPはパラメータ置換のために_を使用しようとしているようです。次の例を考えてみましょう

List(1,2,5,7).filter(x => x > 4) 

の省略形である上記のように、ここで

List(1,2,5,7).filter(_ > 4) 

filterは、アンダースコアが複数のパラメータを表すことができるが、参照するために使用されている必要があり、タイプA => Unitの機能を取ります各パラメータに正確に1回。このため、OPのスニペットsortedDudesが機能します。したがって、以下は合法です。私は、元のスニペットに問題がsortWith法で必要とされるコンパイラは明確タイプ(A, A) => Booleanの何かにそれを解析することができないということだと思います

List(1,2,5,7).reduce((a,b) => a + b) 

の省略形です

List(1,2,5,7).reduce(_ + _) 

。私たちは以下のようにコンパイラに少し助けを与えることができます。

scala> def op(int: Int, num: Int) = math.abs(int - num) 
op: (int: Int, num: Int)Int 

scala> List(1,7,5,10).sortWith(op(_, 5) < op(_, 5)) 
res0: List[Int] = List(5, 7, 1, 10) 
関連する問題