function

関数

  • Scala の関数は単に,Function0 ~ Function22 までのトレイトの無名サブクラスのインスタンスを作っているだけ.
    • よって,引数の最大個数は22個である.
  • Function0 ~ Function22 までの全ての関数は引数の数に応じた apply メソッドを定義する必要がある.
  • apply メソッドは Scala のコンパイラから特別扱いされ,x.apply(y)x(y) のように書くことができる.
  • Scala では Function0 ~ Function22 までのトレイトのインスタンスを生成するためのシンタックスシュガーが用意されている.
// 下の2つは同じ扱いになる
val add = new Function2[Int, Int, Int] {
  def apply(x: Int, y: Int): Int = x + y
}
val add = (x: Int, y: Int) => x + y // 上のシンタックスシュガー

// 下の2つは同じこと
add.apply(10, 20)
add.(10, 20)

無名関数

  • 無名関数とは,関数の中に関数オブジェクトだけが入っている関数のこと.
  • よって,無名関数は単なる FunctionN オブジェクトになる.
  • よって,無名関数を自由に変数や引数に代入したり返り値として返したりできる.
  • このように,関数を自由に変数や引数に代入したり返り値として返したりできる性質を,Scala では「関数が第一級の値(First Class Object)である」と表現する.

関数のカリー化

  • 関数のカリー化とは,引数が複数個ある関数を,引数が1つの関数のチェインで表現すること.
  • 無名関数を定義する構文をネストするだけで,カリー化が行える.
val add = (x: Int, y: Int) => x + y
val addCurried = (x: Int) => ((y: Int) => x + y) // カリー化

add(10, 20)
add(10)(20)

メソッドと関数は違うもの

  • メソッド: def で始まる構文で定義されたものであり,第一級の値でない.
  • 関数: 第一級の値である.
  • つまり,Scala には,メソッドを引数に取ったり,メソッドを返したりする関数やメソッドが変数に入ったものは存在しないということ.

高階関数

  • 高階関数とは,関数を引数に取ったり,関数を返したりするメソッドや関数のこと.