2012-03-03 4 views
4

私は次の操作を実行しようとしたとき、私はスカラ座での奇妙な型の不一致エラーを取得しています:マップにフィルタを使用できないのはなぜですか?

val m = Map[String, Int]("a" -> 1, "b" -> 2, "c" -> 3) 
val n = Map[String, Int]("c" -> 3, "d" -> 4, "e" -> 5) 
n.filter((k: String, v: Int) => !m.contains(k)) 
<console>:10: error: type mismatch; 
found : (String, Int) => Boolean 
required: (String, Int) => Boolean 
       n.filter((k: String, v: Int) => !m.contains(k)) 

私が何か間違ったことをやっていますか?タイプの不一致はここで意味をなさない。

答えて

14

実際に必要なタイプは((String,Int))です。つまり、1つの引数がPair[String,Int]ですが、構文は2つの別々の引数を渡しています。あなたはペアを一致させるためにcaseキーワードを使用して代わりに部分関数に渡すことができます。

n.filter { case(k, v) => !m.contains(k) } 

が、ここでそれについてRelevant articleです。

ルイージは、ここではfilterKeysがより適切な方法であることを指摘する小道に値する。そうentry._1が鍵となりentry(key, value)を含むタプルです

n.filter(entry => !m.contains(entry._1)) 

+3

値が使用されていないので、人は考えるかもしれない:! 'n.filter {場合(kは、_)=> m.contains(K) } ' –

+0

はい、それはperfe ctlyは有効です。 – Nick

+0

パーフェクト、感謝ニック! –

4

はこれを試してみてください。

9

エラーメッセージは、Scala 2.9の既知のバグです。

何それは言うべきことである

found : (String, Int) => Boolean 
required: ((String, Int)) => Boolean 

すなわち、 filterFunction1[(String, Int), Boolean]が必要な場合はFunction2[String, Int, Boolean]を指定しています。

あなたが直接トマシュが示すように、タプル機能を提供、またはあなたがtupledメソッドを使用して、タプルを取るFunction1にあなたのFunction2を回すことができ、ニックが示すように、タプルに一致するパターンマッチングを使用することができます。

n.filter(((k: String, v: Int) => !m.contains(k)).tupled) 
// or 
n.filter(Function.tupled((k, v) => !m.contains(k))) 

しかし、あなたが使用して最高のオフだビルトインfilterKeys方法:

n.filterKeys(!m.contains(_)) 
+0

+1は2.9バグであることを指摘しています(私は2.8でそれを試したので、正しいエラーメッセージを得たことに気づきました)、そして 'filterKeys'に言及するために。 – Nick

関連する問題