2013-10-26 14 views
11

Int、Doublesなどの追加可能な要素を含むタプルを簡単に追加できますか?例について 、2つのタプルを単純な要素としてスカラに追加する

(1,2)+(1,3) = (2,5) 
+0

何を達成しようとしていますか?主にそのようなもののためのタプルを使って(おそらく)悪いスタイルとみなされます。 –

+0

タプルはこのタイプのものではありません。それらは、複数の値を返すメソッドの便利なラッパーです。そのため、コレクションのような便利な機能を持たないのです。 –

+0

私はタプルのリストを減らそうとしていました。私はタプルを使っていくつかのmap reduce型操作を行っています。税関のクラスとオブジェクトは過度のようです。 – Arun

答えて

17

Scalaz

import scalaz._, Scalaz._ 

scala> (1, 2.5) |+| (3, 4.4) 
res0: (Int, Double) = (4,6.9) 

範囲で暗黙Semigroup[A]持つ任意のクラスAためのオペレータ|+|があります。 Int|+|の場合は、デフォルトで+です(コード内で再定義できます)。

ABに暗黙のうちにSemigroupがある場合、すべてのタプルに暗黙的なSemigroup[(A, B)]があります。

Scalaz cheat sheetを参照してください。

:-) Scalaz答えを

11

1あなたはそれの非常に単純なバージョンをしたい場合は、のような暗黙のクラスを定義することができます。ため

implicit class TuppleAdd(t: (Int, Int)) { 
    def +(p: (Int, Int)) = (p._1 + t._1, p._2 + t._2) 
} 

(1, 1) + (2, 2) == (3, 3) 

//アップデート1、より一般的なバージョン番号:

0123:

だから、これが唯一のIntのために定義された最もシンプルなバージョンです、私たちは、ScalaのNumericを使用して、すべての数値のためにそれをgenerifyことができ

implicit class Tupple2Add[A : Numeric, B : Numeric](t: (A, B)) { 
    import Numeric.Implicits._ 

    def + (p: (A, B)) = (p._1 + t._1, p._2 + t._2) 
} 

(2.0, 1) + (1.0, 2) == (3.0, 3) 
+2

質問には「Int」だけではありません。あなたは 'math.Numeric'で次のように答えを改善することができます:'暗黙のクラスTuppleAdd [A:数値、B:数値](t:(A、B)){import Numeric.Implicits._; def +(p:(A、B))=(p・1 + t・1、p・2 + t・2)} 'となる。 – senia

+0

それは本当です:-)構造型のバージョンについても考えましたが、おそらくそこには行かないでください;-) –

+2

暗黙のdef tupleIsNumeric [A:数値、B:数値]を実装しようとしました:数値[(A、B)] 'であるが、' + '演算子(' -'と '*')がうまく動作する[issue](http://pastebin.com/fyty7mMy)がある。 – senia

関連する問題