Scalaのラムダ式
code:lambda-syntax.scala
// 基本形
val basic = (x: Int) => x +1
// 複数の引数がある場合
val multipleArgs = (a: Int, b: Int) => a + b
// 複数の式を入れたければブロックで囲む
val multipleStatement = (x: Int) => {
val y = x * 2
y + 1
}
// 引数を使わずに捨てる場合は _ という名前にする
// 本文中で参照できなくなるので「使わない」という意図を示すことができる
// ただし x という名前にして使わなくても、golangのようにコンパイルエラーが起きるわけではない
val discardArgs = (_: Int) => 42
// 型注釈を変数宣言の方に寄せて書くパターン
val typeNotation: Int => Int = x => x + 1
// 仮引数を省略しプレースホルダ _ を使うこともできる
val placeHolder: Int => Int = _ + 1
val placeHolderMulti: (Int, Int) => Int = _ + _
メソッド(値ではない)をラムダ(値)にする操作をeta展開という。 scalaでは無引数のメソッド名は呼び出しと解釈されるので、末尾に _を書いてメソッドそのものを示すルールがあった。
scala 3ではその辺が強化されてるらしい。
code:eta.scala
// 元のメソッド
def double(x: Int):Int = x * 2
// scala2のルール。この末尾の _ はマーカーであって、プレースホルダではない
val lambdaFromMethod = double _
// 期待型を明示するとマーカーなしで展開できる
val automaticEta: Int => Int = double