最新のプログラミング言語の多くは、クロージャ、つまりコード(ブロックまたは関数)の概念をサポートしています。
- 値として扱うことができるため、変数に格納し、コードのさまざまな部分に渡し、プログラムの一部で定義し、同じプログラムのまったく異なる部分で呼び出すことができます。
- 変数が定義されているコンテキストから変数をキャプチャし、後で呼び出されたときに(おそらくまったく異なるコンテキストで)変数にアクセスできます。
以下は、Scalaで記述されたクロージャーの例です。
def filterList(xs: List[Int], lowerBound: Int): List[Int] =
xs.filter(x => x >= lowerBound)
関数リテラルx => x >= lowerBound
には、同じ名前のlowerBound
関数の引数によって閉じられている(バインドされている)自由変数が含まれていますfilterList
。クロージャはライブラリメソッドに渡さfilter
れ、通常の関数として繰り返し呼び出すことができます。
私はこのサイトで多くの質問と回答を読んでいますが、私が理解している限り、閉鎖という用語は関数型プログラミングと関数型プログラミングスタイルに自動的に関連付けられることがよくあります。
ウィキペディアの関数プログラミングの定義は次のとおりです。
コンピュータサイエンスでは、関数型プログラミングは、計算を数学関数の評価として扱い、状態や変更可能なデータを回避するプログラミングパラダイムです。状態の変化を強調する命令型プログラミングスタイルとは対照的に、関数の適用を強調します。
そしてさらに
[...]関数コードでは、関数の出力値は関数に入力された引数にのみ依存します[...]。副作用をなくすことで、プログラムの動作の理解と予測がはるかに容易になります。これは、関数型プログラミングを開発するための主要な動機の1つです。
一方、プログラミング言語によって提供される多くのクロージャー構成では、クロージャーが非ローカル変数をキャプチャーし、クロージャーが呼び出されたときにそれらを変更できるため、それらが定義された環境に副作用が生じます。
この場合、クロージャは関数型プログラミングの最初のアイデアを実装します(関数は他の値のように移動できるファーストクラスのエンティティです)が、2番目のアイデアは無視します(副作用を回避します)。
副作用のあるこのクロージャの使用は、関数型スタイルと見なされますか、それとも、関数型と非関数型プログラミングスタイルの両方に使用できるより一般的な構造と見なされますか?このトピックに関する文献はありますか?
重要な注意点
副作用の有用性や副作用のあるクロージャーの有用性については質問していません。また、副作用の有無にかかわらず、クロージャーの長所/短所についての議論には興味がありません。
このようなクロージャの使用が関数型プログラミングの支持者によって依然として関数型スタイルと見なされているかどうか、または逆に関数型スタイルを使用する場合にそれらの使用が推奨されていないかどうかを知りたいだけです。