0

私は Java 出身で、次のような 2 つの部分関数を組み合わせたいと考えています。

def sum(a: Int, b: Int, c: Int) : Int = a + b + c

私はこのようなものを書きたい:

val l = List(1, 2, 3)
l.foreach(println _  sum (1, _ : Int, 3) ) // It's supposed to apply
                                  // the partial sum(1, _: Int, 3) 
                                  // and println computed value.

しかし、コンパイルを拒否します。簡潔に修正する方法はありますか?

4

2 に答える 2

3

あなたがやろうとしていたことにはほとんど問題がありません。まず、printlnはオーバーロードされたメソッドであるため、このような関数に eta 展開しようとするとprintln _、Scala は引数が 0 の最短形式をとります。

scala> println _
res0: () => Unit = $$Lambda$1048/48841776@58ec44ec

したがって、より具体的にする必要があります。

scala> println(_: Int)
res1: Int => Unit = $$Lambda$1064/1621799037@1e8bddc4

正しい関数が得られたので、やるべきことがもう 1 つあります:compose適切な括弧を追加します (追加の括弧は無名関数をラップします):

scala> l.foreach((println(_: Int)) compose  (sum (1, _: Int, 3)))
5
6
7

または他の方向に:

scala> l.foreach((sum (1, _: Int, 3)) andThen (println(_: Int)))
5
6
7
于 2016-08-18T18:32:12.137 に答える
2

あなたが望むものを正しく読んでいると仮定すると(そしてコードでさえそれは大きな仮定です)、ここにそれを達成するかもしれないスニペットがあります:

scala> def sum(a: Int, b: Int, c: Int) : Int = a + b + c
sum: (a: Int, b: Int, c: Int)Int

scala> val sum13 = sum(1, _ : Int, 3)
sum13: Int => Int = <function1>

scala> val printInt = println( _ : Int )
printInt: Int => Unit = <function1>

scala> List(1,2,4) foreach { printInt compose sum13 }
5
6
8

に注意してcomposeください。もう 1 つの方法は、明示的に構成することx => printInt(sum13(x))です。

于 2016-08-18T17:00:16.540 に答える