2011-08-22 9 views
4

문자열에서 int로 스칼라로 맵을 필터링하려고하는데 이상한 문제가 있습니다.scala 익명 함수 질문

나는 REPL에 다음을 넣으면 ...

scala> myMap.filter(_._2 > 1) 
res9: scala.collection.immutable.Map[java.lang.String,Int] = Map(b -> 2, c -> 3) 

하지만 이것이 실패 ...

scala> val myMap = Map("a" -> 1, "b" -> 2, "c" -> 3) 
myMap: scala.collection.immutable.Map[java.lang.String,Int] = 
| Map(a -> 1, b -> 2, c -> 3) 

그것은 확인 지금까지, 그리고이 작품

scala> myMap.filter((k:java.lang.String, v:Int) => v > 1) 
<console>:9: error: type mismatch; 
found : (java.lang.String, Int) => Boolean 
required: ((java.lang.String, Int)) => Boolean 
    myMap.filter((k:java.lang.String, v:Int) => v > 1) 

제 질문은 오류 메시지와 여분의 괄호 쌍으로 무엇이 진행되고 있습니까? 여분의 괄호 세트를 넣으려고하면 오류가 발생합니다. 합법적 인 매개 변수가 아닙니다.

답변

16

myMap.filter 유형 Tuple2[String, Int] => Boolean의 기능을 기대해야합니다, 이는 ((String, Int)) => Boolean과 같습니다. 함수를 (String, Int) => Boolean 유형의 함수로 전달합니다. 즉 하나의 Tuple2이 아닌 두 개의 인수를 사용하는 함수입니다.

두 가지 방법이 작동에 도착 :

myMap.filter { case (k, v) => v > 1 } 

myMap.filter(Function.tupled((k, v) => v > 1)) 

패턴 매칭에 의한 첫 번째 작품, 두 번째

((String, Int)) => Boolean에 기능을 (String, Int) => Boolean를 변환하여.

그런데 튜플과 함수 인수 목록을 통합하는 방법에 대한 논의가있었습니다. 앞으로의 스칼라 버전에서는 모든 함수가 단일 매개 변수 (튜플 일 수 있음)를 취할 것입니다.

+1

'Function.tupled'의 경우 +1입니다. – agilesteel

+0

동의. Function.tupled는 패턴 일치가 더 트릭처럼 보이지만 명시 적입니다. – andyczerwonka

+1

이것이 바보 같은 질문 인 경우 죄송합니다. 대소 문자와 일치하는 패턴은 중괄호 {}로 작동하지만 괄호는 사용하지 않는 이유는 무엇입니까? –

6

filter은 하나의 매개 변수 만 허용하는 함수를 허용합니다. 표현식에서 표현식은 두 개의 매개 변수를 허용합니다. 그러나 요소는 쌍으로 발생하므로 두 개의 매개 변수를 제공 할 수 있다고 생각할 수 있습니다. 퍼팅의 올바른 방법이 될 것 같은 뭔가 :

입니다
myMap.filter (p => p._2 > 1) 

, 내가 한 쌍의 p을 받고, 두 번째 요소는 1보다 큰