2016-12-15 13 views
2

私はもちろん、私は次の方法を使用することができ、Map("one" -> 2, "two" -> 3, "three" -> 4)の値に2+3+4を合計する:scala.collection.immutable.MapのAPI合計を直接使用する方法は?

  1. Map("one" -> 2, "two" -> 3, "three" -> 4).foldLeft(0)(_ + _._2)
  2. Map("one" -> 2, "two" -> 3, "three" -> 4).values.sum()

私はMapは、他のより直接的なAPIの合計を持っているが見つかりました: def sum: A、しかし、私はこれについての例を検索していませんAPI、それを使用する方法?

+1

ためimplicitパラメータを見つけることができます。 [*なぜscaladocメソッドのシグネチャが間違っていますか?*](https://stackoverflow.com/questions/26132459/why-are-scaladoc-method-signatures-wrong) –

答えて

3

sum[B >: (A, B)](implicit num: Numeric[B]): Bの場合は、表示されているとおり、implicitパラメータが必要です。パラメータタイプはNumeric[B]タイプです。

スカラNumericは、一連の数学演算を定義したtraitです。あなたのケースのための http://www.scala-lang.org/api/current/scala/math/Numeric.html

は、タイプがMap[String, Int]あるので、あなたは次のように、sum方法のためNumeric[(String, Int)]ためimplicitを実装する必要があります。私たちは自分のNumericタイプを実装する必要があり、上記のコードのよう

trait MyTupleNumeric extends Numeric[(String, Int)] { 
    def plus(x: (String, Int), y: (String, Int)) = ("", x._2 + y._2) 

    override def minus(x: (String, Int), y: (String, Int)): (String, Int) = ("", x._2 - x._2) 

    override def times(x: (String, Int), y: (String, Int)): (String, Int) = ("", x._2 * y._2) 

    override def negate(x: (String, Int)): (String, Int) = ("", -x._2) 

    override def fromInt(x: Int): (String, Int) = ("", x) 

    override def toInt(x: (String, Int)): Int = x._2 

    override def toLong(x: (String, Int)): Long = x._2.toLong 

    override def toFloat(x: (String, Int)): Float = x._2.toFloat 

    override def toDouble(x: (String, Int)): Double = x._2.toDouble 

    override def compare(x: (String, Int), y: (String, Int)): Int = x._2 - y._2 
    } 

    implicit object MyTupleNumericImplicit extends MyTupleNumeric 

    val f = implicitly[Numeric[(String, Int)]] // implicitly is used find implicits base on the type 
    println(f.plus(("one", 2), ("two", 3))) 
    val r = Map("one" -> 2, "two" -> 3, "three" -> 4) 
    println(r.sum._2) 
    println(r.sum(MyTupleNumericImplicit)) 

(String, Int)で処理し、メソッドを実装します。

そして私たちはimplicitこれを私たちのスコープに入れましたので、implicitlyを使ってfunctionと呼ぶことができます。

そしてsum方法は、また、実際にsum` `の完全な型シグネチャではありませんNumeric[(String, Int)]

2

Map.sumメソッドは、あなたの望むものを実行しません。関数はそのまま表示されます。

Mapがsumメソッドを持つ理由は、すべてTraversableOnceクラスには、コレクション型が数値の場合にのみ機能するsumメソッドがあることです。ただし、Map[K, V]TraversableOnce[(K, V)]であるため、この方法は機能しません(キー値タプルは数値型ではありません)。

関連する問題