2017-09-24 5 views
0

私は、2つの配列を地図関数に圧縮した結果を渡す簡潔な方法を見つけようとしています。入力変数の両方を宣言する必要はなく、ラムダで太い矢印を使用する必要もありません。Scalaのタプルとしてラムダをマップする入力を渡す

これは可能ではないかもしれませんが、私は諦める前に尋ねると思いました。

最初の例は、両方の配列を要素ごとに追加した結果を出力する作業コードです。 zipのラムダは、xとyを宣言してから使用する必要があります。

2番目の例は、変換関数に圧縮された入力をより使いやすくするために、「_」などを使用して何をしたいのかを示す非コンパイルコードです。

例1

object Example extends App { 

    val numbers1: Array[Int] = Array(1,2,3,4,5) 
    val numbers2: Array[Int] = Array(9,8,7,6,5) 

    val result = (numbers1, numbers2).zipped.map((x,y) => sum(x,y)) 

    result.foreach(println(_)) 

    def sum(x: Int, y: Int): Int = { 
    x+y 
    } 
} 

変換関数は、「和」のような短い名前を持ち、入力配列がプリミティブであるが、そのラッパー・オブジェクトの配列を渡すときに物事がより詳細得るとき、これは問題あり変換が引数として必要とするいくつかのメンバ変数を含みます。

このような構文の砂糖はありますか?

例2

object Example extends App { 

    val numbers1: Array[Int] = Array(1,2,3,4,5) 
    val numbers2: Array[Int] = Array(9,8,7,6,5) 

    val result = (numbers1, numbers2).zipped.map(sum(_)) 

    result.foreach(println(_)) 

    def sum(inputTuple: (Int, Int)): Int = { 
    val x = inputTuple._1 
    val y = inputTuple._2 
    x + y 
    } 
} 

よりI詳細このより私はコードのにおいに自分自身を書いているように私は、感じてそう言うと、私は別の問題を解決するために行くだろうしてください答えのthatsので、もし方向。

+0

あなたは[矢印型クラス](http://eed3si9n.com/learning-scalaz/Arrow.html) –

答えて

3

あなただけ...

val result = (numbers1, numbers2).zipped.map(sum) 

...あるいはスリッカーをすることができます...

val result = numbers1 zip numbers2 map sum 

また、このフォーマットはsum()で、より自然な引数リストを可能にすることは注目に値します方法。

def sum(x:Int, y: Int): Int = x + y 
+0

を探している可能性があり、不一致のタイプは私の一部にエラーが発生しました。私は反映するために自分の投稿を修正しました。 –

+0

あなたの以前の編集は完璧でした、なぜあなたはそれを削除しましたか? :) –

+0

'map'が' sum'に送信していたものと少し相違しました。タップリングは不要です。 – jwvh

関連する問題