2016-08-11 6 views
2

にジェネリック型とラムダを使用してmyFuncの第2引数は、複雑な引数を持つ関数である:はScalaの

def myFunc(list : List[String], 
      combine: (Map[String, ListBuffer[String]], String, String) => Unit) = { 
    // body of myFunc is just a stub and doesn't matter 
    val x = Map[String, ListBuffer[String]]() 

    list.foreach ((e:String) => { 
     val spl = e.split(" ") 
     combine(x, spl(0), spl(1)) 
    }) 

    x 
} 

私はmyFuncに2つ目の引数を渡す必要があるので、様々なタイプA, Bの代わりに特定して使用することができますString, ListBuffer[String]

def myFunc(list : List[A], combine: (Map[A, B], A, A) => Unit) = { 

    val x = Map[A, B]() 

    list.foreach(e => {   
     combine(x, e) 
    }) 
} 

このような構造体を宣言して呼び出すにはどうすればいいですか?あなたは次のことを行うことができます

+1

)=>単位) ' – marstran

答えて

2

def myFunc[A, B](list : List[A], combine: (Map[A, B], A, A) => Unit) = { 
    val x = Map[A, B]() 
    list.foreach (e => combine(x, e, e)) 
    x 
} 

広告が

myFunc[String, Int](List("1","2","3"), (obj, k, v) => obj.put(k, v.toInt)) 
1

ようにそれを使用するには、あなたが使用しているコンテナを一般化するために探しているようです。このようなものを探していたのですか?ここではscala.language.higherKindsをインポートします。Containerは、1つの型パラメータを型パラメータとしてaddPairに渡します。 `DEF myFuncという[A、B](リスト:リスト[A]、コンバイン:(マップ[A、B]、A、あなたはこのように、AとBは、型パラメータであることを指定する必要があり

import scala.language.higherKinds 

def addPair[K, V, Container[_]](map: Map[K, Container[V]], 
           addToContainer: (Container[V], V) => Container[V], 
           emptyContainer: => Container[V], 
           pair: (K, V)): Map[K, Container[V]] = { 
    val (key, value) = pair 
    val existingValues = map.getOrElse(key, emptyContainer) 
    val newValues = addToContainer(existingValues, value) 

    map + (key -> newValues) 
}