あるプログラマの日記

プログラマのメモ、出来事、考えたこと、勉強とかの雑記

高階関数、クロージャ

高階関数

  • 関数を引数として受け取る関数または関数を返す関数のことを高階関数と呼ぶ。

文字列の引数 str を受け取って、「Int型整数を引数で受け取り文字列を返す関数」を返す。

scala> def foo(str: String) = (v: Int) => str + v
foo: (str: String)(Int) => java.lang.String

scala> val bar = foo("this year ")
bar: (Int) => java.lang.String = <function1>

scala> bar(2012)
res1: java.lang.String = this year 2012

scala> val bar2 = foo("next year ")
bar2: (Int) => java.lang.String = <function1>

scala> bar2(2013)
res2: java.lang.String = next year 2013

クロージャ

意味が難解そうなので、調べた範囲でまとめてみた。
補足、間違いがあれば、ツッコミお願いします。

  • 定義された関数のスコープ外の変数を取り込んで参照する関数のこと。
  • 関数のスコープ外の変数を取り込んで関数内で参照可能にすることを束縛(バインド)と呼ぶ
  • 関数のスコープ外から取り込んで参照している変数を自由変数と呼ぶ。
  • 関数内で参照できるようにするために自由変数は束縛(バインド)される。

上の高階関数 foo から返される関数は、foo の引数 str を参照しているクロージャになる。