5

私はクロージャーの広い概念を理解しています (関数は、定義された時点で環境のスナップショットと共に保存されます)。ファースト クラスの市民としての関数とは、言語の他のデータ型と同様に、関数を渡したり返したりできることを意味します。

興味深いことに、Python、Javascript、Scheme など、私が扱ったすべての言語は、ファースト クラスの市民としての機能を備えているため、常にクロージャも備えているようです。

実際、関数との間でクロージャーを渡したり返したりすることは、関数を言語の第一級市民として実装する1つの方法ですが、それらを書くことができることが、関数が第一級市民であることの直接的かつ必然的な結果であるかどうかはわかりません。

より具体的に言えば:

ファーストクラスの関数を持っているが、クロージャーを書くことができない言語の実際の例を提供できますか?

4

1 に答える 1

3

そのような言語は、関数が第一級オブジェクトである言語です。

関数が別の関数内で定義されている場合、ネストされた関数は高階関数と呼ばれます。

関数が第一級オブジェクトであるということは、関数が数値、文字列、クラスなどの他のオブジェクトと変わらないことを意味します。したがって、関数を引数として渡したり、他のオブジェクトと同じように呼び出したりせずに返したりすることができます。たとえば Python では、括弧を省略することで、関数を呼び出さずにそれ自体を返すことができます。

別のラッピング関数が返すことができる高階関数を記述できることは、まさにクロージャーの定義であり、関数をファーストクラス オブジェクトとして持つことの結果です。

したがって、あなたの質問への答えは次のとおりです。はい、クロージャーは、その結果であるという意味で、関数をファーストクラスのオブジェクトとして持つために必要です。より直接的に言えば、ファーストクラスの関数を持つことはできず、クロージャーを書くことはできません

第一級関数を持たない一部の言語 (Pascal、Algol) には、レキシカル クロージャーと呼ばれる一種のクロージャーがあることに注意してください。しかし、それらは実際の閉鎖よりもはるかに強力ではありません。

于 2014-12-16T02:34:11.773 に答える