2016-08-18 15 views
0

私は、Javaから来て、このように二つの部分の機能を組み合わせることを希望は:組み合わせる部分関数

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. 

をしかし、それはコンパイルすることを拒否する。それを簡潔に修正する方法はありますか?ここでは、私はあなたが正しく何をしたい読んで(と、それは巨大な仮定だとしてもコード)それを達成する可能性があると仮定すると、スニペット

+0

あなたが部分的評価機能( 'F(1、_)'のようなもの)と部分的機能をアップミキシングされます。 'sum'は部分関数ではなく総関数であり、これは関数のすべてのドメイン要素に対して、そのコード領域に1つの関連要素があることを意味します。 – pedrofurla

+0

@pedrofurla部分的に適用された関数、右。私はそれらを構成することはできません、私はできますか? – user3663882

+1

2行目は意味をなさない。理由を説明しようとする価値があるかどうかはわかりません。 – pedrofurla

答えて

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に注意してください。別の方法は、明示的にx => printInt(sum13(x))を構成することです。

+0

Thatnks、なぜ 'printFoo compose sum(1、_:Int、3)'は動作しないのですか? – user3663882

+2

@ user3663882 'sum'の周りに明示的なカッコを入れてください – Bergi

3

何をしようとしていたかにはほとんど問題がありません。だから、

scala> println _ 
res0:() => Unit = $$Lambda$1048/[email protected] 

:まず第一に、printlnあなたはETA-拡大このprintln _のような関数にそれをしようとしているときに、Scalaは0引数を有するものである最短のフォームを、取って、オーバーロードされた方法であり、あなたはより具体的にする必要があります。

scala> l.foreach((println(_: Int)) compose (sum (1, _: Int, 3))) 
5 
6 
7 
composeと適切な括弧を(追加の括弧は無名関数をラップ)を追加するには:今、私たちが行うにはもう一つのことがあり、正しい機能を持っていることを

scala> println(_: Int) 
res1: Int => Unit = $$Lambda$1064/[email protected] 

または他の方向に:

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

いい説明、ありがとう – user3663882

関連する問題