2013-03-24 1 views
0

foldl을 사용하여 목록에서지도에 쌍을 추가하려고합니다. 나는 다음과 같은 오류가 발생합니다 :스칼라 : foldl을 사용하여 목록에서지도에 쌍을 추가 하시겠습니까?

"missing arguments for method /: in trait TraversableOnce; follow this method with `_' if you want to treat it as a partially applied function" 

코드 :

 val pairs = List(("a", 1), ("a", 2), ("c", 3), ("d", 4)) 

    def lstToMap(lst:List[(String,Int)], map: Map[String, Int]) = { 
    (map /: lst) addToMap (_, _) 
    } 

    def addToMap(pair: (String, Int), map: Map[String, Int]): Map[String, Int] = { 
     map + (pair._1 -> pair._2) 
    } 

에 어떤 문제가 있습니까?

답변

1

당신은 addToMap의 입력 값을 교환하고 괄호에 넣어해야합니다

def addToMap(map: Map[String, Int], pair: (String, Int)): Map[String, Int] = { 
    map + (pair._1 -> pair._2) 
    } 

    def lstToMap(lst:List[(String,Int)], map: Map[String, Int]) = { 
    (map /: lst)(addToMap) 
    } 

missingfaktor의 대답은 훨씬 간결하고 재사용 가능하며 scala와 유사합니다.

10
scala> val pairs = List(("a", 1), ("a", 2), ("c", 3), ("d", 4)) 
pairs: List[(String, Int)] = List((a,1), (a,2), (c,3), (d,4)) 

scala> (Map.empty[String, Int] /: pairs)(_ + _) 
res9: scala.collection.immutable.Map[String,Int] = Map(a -> 2, c -> 3, d -> 4) 

하지만 알다시피, 당신은 다만 수 :이 작업을 위해

scala> pairs.toMap 
res10: scala.collection.immutable.Map[String,Int] = Map(a -> 2, c -> 3, d -> 4) 
+0

'(Map.empty [String, Int]/: pairs) (_ + _)'에 대해 말하면 Map에 정의 된 덧셈 이항 연산자'+'를 의미합니까? 다음과 같은 것을 허용하는 것 : val m = Map.empty [String, Int]; 'm + ("a"-> 1)'맞습니까? ** BTW 왜 내가'm + ("a", 1)'을 할 수 없습니까? ** –

+0

예. 예. 스칼라는 이것을 'm. + ("a", 1)'로 해석하기 때문에; 여분의 괄호 쌍이 필요합니다. – missingfaktor

1

이미 Tuple2s 컬렉션이있는 경우 직접 구현할 필요가 없습니다. 이미 요소가 튜플 인 경우에만 작동하는 toMap 메서드가 있습니다!

전체 서명 : 그것은/요소 유형 A와 캐스팅을 입력 (T, U)의 튜플로 변환 할 수있는 기능이 본질적으로 암시 A <:< (T, U)을 요구함으로써 작동

def toMap[T, U](implicit ev: <:<[A, (T, U)]): Map[T, U] 

. 이것을 말하는 또 다른 방법은 A이 -이라는 암묵적인 증거가 필요하다는 것입니다. 따라서 이것은 완전히 유형 안전합니다.

업데이트 : @missingfaktor이지도에 제대로 접는에 관한 질문에 직접 대답은 아니지만, 나는 그것이 중요한 강조하다고 생각

1

말한 그

  • Map

의 일반적인 Traversable으로 처리 할 수 ​​있습니다 당신은 쉽게 두 가지를 결합 할 수 있습니다!

scala> val pairs = List(("a", 1), ("a", 2), ("c", 3), ("d", 4)) 
pairs: List[(String, Int)] = List((a,1), (a,2), (c,3), (d,4)) 

scala> Map.empty[String, Int] ++ pairs 
res1: scala.collection.immutable.Map[String,Int] = Map(a -> 2, c -> 3, d -> 4) 

scala> pairs.toMap 
res2: scala.collection.immutable.Map[String,Int] = Map(a -> 2, c -> 3, d -> 4) 
관련 문제