2016-09-27 8 views
2

TYPE A:Wyこれらの一見同等の関数定義は、異なる結果をもたらしますか?

val even1 = (x:Int) => { println("in even1"); x % 2 == 0} 

REPLの出力:

even1: Int => Boolean = <function1> 

のTYPE B:REPL上

val even2 : Int => Boolean = { println("in even2");_% 2 == 0} 

が出力:

in even2 
even2: Int => Boolean = <function1> 

私は」の違いを知っていますdef 'と関数の 'val'宣言は、上記の状態は私とは少し違って見えます。ご理解ください。

答えて

5

even1およびeven2は実際には同等ではありません。理由を理解するには、ここにeven2を定義する異なるが同等の方法である:

val even2 : Int => Boolean = { println("in even2"); x => x % 2 == 0 } 

今... even1の定義の右辺(RHS)がIntを受け取り、ブロックを返す関数でありますブーリアン式が続くprintステートメントが含まれています。

対照的に、even2の場合、関数とブロックは「内側に」あります。右側はprint文とタイプInt => Booleanの関数を含むブロックです。

ブロックは式であり、その式の結果はブロックに含まれる最後の式(存在する場合は())の結果です。したがってeven1が呼び出されるたびにeven1printlnステートメントが実行され、even2が定義されている場合は、even2printlnステートメントが1回だけ実行されます。

+0

'even1のprintln文はeven1が呼び出されるたびに実行されますが、even2のprintln文はeven2が定義されたときに一度だけ実行されます。どうして?あなたが提供する答えは 'even1'にも当てはまります:'右辺はブロックです... ' – jarandaf

+0

私は同じ質問をしたいのですが、なぜこの異なる動作ですか?両方の関数として、宣言はREPL上で同じように見えます出力は – Sunny

+1

@ jarandafです。「even1」の定義の右辺はブロックではなく、関数です: '(x:Int)=> {println(" even1 "); x%2 == 0} 'となります。 – Jubobs

関連する問題