コンピュータプログラミングにおいて、匿名関数(関数リテラル、式、またはブロック)は、識別子にバインドされていない関数定義です。匿名関数は、多くの場合、高階関数に渡される引数であったり、関数を返す必要のある高階関数の結果を構築するために使用されます。[1] 関数が一度だけ、または限られた回数だけ使用される場合、匿名関数は名前付き関数を使用するよりも構文が軽い場合があります。匿名関数は、関数型プログラミング言語や第一級関数を持つ他の言語に広く見られ、関数型に対して、リテラルが他のデータ型に対して果たすのと同じ役割を果たします。
無名関数は、電子計算機が登場する前の1936年に、アロンゾ・チャーチがすべての関数が匿名となるラムダ計算を発明したことに由来する。 [2]いくつかのプログラミング言語では、無名関数はキーワードlambda を使用して導入され、無名関数はラムダまたはラムダ抽象化と呼ばれることが多い。無名関数は1958年のLisp以来プログラミング言語の機能であり、匿名関数をサポートする現代のプログラミング言語はますます増えている。
名前
「ラムダ抽象」、「ラムダ関数」、「ラムダ式」という名前は、ラムダ計算における関数抽象の表記法を指します。通常の関数f ( x ) = M は(λ x . M )と記述され、M はx を使用する式です。 の Python 構文と比較してください。
lambda x: M
「矢印関数」という名前は、数学的な「マップ」記号x ↦ Mを指します。JavaScriptの構文と比較してください。[3]x => M
用途
匿名関数は、名前を付ける必要のない機能や、おそらくは短期的な使用を目的とした機能を収容するために使用できます。注目すべき例としては、クロージャやカリー化などがあります。
匿名関数の使用はスタイルの問題です。匿名関数を使用することが問題を解決する唯一の方法であることはありません。各匿名関数を名前付き関数として定義し、名前で呼び出すこともできます。匿名関数は、名前付き関数を定義するよりも簡潔な表記法を提供することがよくあります。ローカル スコープで名前付き関数の定義を許可しない言語では、匿名関数はローカル スコープを介してカプセル化を提供できますが、そのような匿名関数の本体のコードは再利用できないか、個別にテストできない可能性があります。式で使用される短くて単純な匿名関数は、個別に定義された名前付き関数よりも読みやすく理解しやすい場合がありますが、説明的な名前がないと理解しにくくなる可能性があります。
一部のプログラミング言語では、匿名関数は、イベントをコールバックにバインドしたり、特定の値に対して関数をインスタンス化したりするなど、非常に特殊な目的のために実装されるのが一般的です。これは、名前付き関数を呼び出すよりも、動的プログラミング言語では効率的で、読みやすく、エラーが発生しにくい場合があります。
以下の例は Python 3 で書かれています。
ソート
非標準的な方法でソートしようとする場合、名前付き関数を作成するのではなく、ソート ロジックを匿名関数として含める方が簡単な場合があります。ほとんどの言語では、任意のオブジェクトをソートするソート アルゴリズムを実装する汎用ソート関数が提供されています。この関数は通常、2 つの要素が等しいかどうか、または一方が他方より大きいか小さいかを比較する方法を決定する任意の関数を受け入れます。
文字列のリストを文字列の長さでソートする次の Python コードを検討してください。
>>> a = [ '家' , '車' , '自転車' ]
>>> a .sort ( key = lambda x : len ( x )) >>> a [ '車' , '自転車' , '家' ]
この例の匿名関数はラムダ式です。
ラムダ x : len ( x )
匿名関数は 1 つの引数 を受け取りx、その引数の長さを返します。この長さは、sort()メソッドによってソートの基準として使用されます。
Pythonのラムダ関数の基本構文は
lambda arg1 、 arg2 、 arg3 、 ... : <引数に対する演算 で値を返す>
ラムダ関数によって返される式は変数に割り当てて、コード内の複数の場所で使用できます。
>>> 加算 = ラムダ a : a + a
>>> 加算( 20 )
40
もう 1 つの例としては、リスト内の項目をクラス名で並べ替えることがあります (Python では、すべてにクラスがあります)。
>>> a = [ 10 , ' number ' , 11.2 ]
>>> a .sort ( key = lambda x : x . __class__ . __name__ ) >>> a [ 11.2 , 10 , 'number' ]
11.2にはクラス名 " float" があり、10にはクラス名 " int" があり、には'number'クラス名 " " があることに注意してくださいstr。ソート順は " float"、" int"、" str" の順です。
閉鎖
クロージャは、バインドされた変数を含む環境で評価される関数です。次の例では、入力をしきい値と比較する匿名関数で変数「threshold」をバインドします。
def comp (しきい値):
戻り値 lambda x : x < しきい値
これは比較関数の一種のジェネレータとして使用できます。
>>> func_a = comp ( 10 )
>>> func_b = comp ( 20 )
>>> print ( func_a ( 5 ), func_a ( 8 ), func_a ( 13 ), func_a ( 21 ))
真 真 偽 偽
>>> print ( func_b ( 5 ), func_b ( 8 ), func_b ( 13 ), func_b ( 21 ))
真 真 真 偽
考えられるすべての比較関数に対して関数を作成するのは非現実的であり、しきい値を今後の使用のために保持しておくのも不便です。クロージャが使用される理由に関係なく、匿名関数は比較を行う機能を含むエンティティです。
カレー作り
カリー化とは、関数を複数の入力ではなく、単一の入力を受け取り、2 番目の入力を受け入れる関数を返すように変更するプロセスです。この例では、任意の整数で除算を実行する関数が、設定された整数で除算を実行する関数に変換されます。
>>> defdivide ( x , y ): ... x / yを返す
>>> def divisor ( d ):
... 戻り値 lambda x : division ( x , d )
>>> 半分 = 除数( 2 )
>>> 三分の一 = 除数( 3 )
>>> 印刷(半分( 32 )、 3 番目( 32 ))
16.0 10.666666666666666
>>> 印刷(半分( 40 ), 3番目( 40 ))
20.0 13.333333333333334
匿名関数の使用はカリー化では一般的ではないかもしれませんが、それでも使用できます。上記の例では、関数 divisor は指定された除数を持つ関数を生成します。関数 half と third は、固定除数を持つ division 関数をカリー化します。
divisor 関数も、変数をバインドすることによってクロージャを形成しますd。
高階関数
高階関数は、関数を引数として受け取るか、結果として関数を返す関数です。これは通常、ループ構造や再帰スキームなど、汎用的に定義された関数の動作をカスタマイズするために使用されます。匿名関数は、このような関数の引数を指定するのに便利な方法です。次の例は Python 3 です。
地図
map 関数は、リストの各要素に対して関数呼び出しを実行します。次の例では、匿名関数を使用して配列内のすべての要素を 2 乗します。
>>> a = [ 1 , 2 , 3 , 4 , 5 , 6 ]
>>> list ( map ( lambda x : x * x , a ))
[ 1 , 4 , 9 , 16 , 25 , 36 ]
匿名関数は引数を受け取り、それを自身で乗算します (2 乗します)。言語の作成者は上記の形式を推奨していません。彼らは、以下に示す形式が同じ意味を持ち、言語の哲学にもっと合致していると主張しています。
>>> a = [ 1 , 2 , 3 , 4 , 5 , 6 ]
>>> [ x * x ( a内のx )[ 1 , 4 , 9 , 16 , 25 , 36 ]
フィルター
フィルター関数は、特定の関数に渡されたときに True と評価されるリストのすべての要素を返します。
>>> a = [ 1 , 2 , 3 , 4 , 5 , 6 ]
>>> list ( filter ( lambda x : x % 2 == 0 , a ))
[ 2 , 4 , 6 ]
匿名関数は、渡された引数が偶数かどうかをチェックします。map の場合と同じように、以下の形式の方が適切だと考えられます。
>>> a = [ 1 , 2 , 3 , 4 , 5 , 6 ]
>>> [ xに対してxが aにある場合、x % 2 == 0 ] [ 2 , 4 , 6 ]
折り畳み
fold 関数は、構造内のすべての要素 (通常は左から右のリスト、reducePython では「左 fold」と呼ばれます) を実行し、値を累積します。これを使用して、構造のすべての要素を 1 つの値に結合することができます。例:
>>> functools import Reduceから >>> a = [ 1 , 2 , 3 , 4 , 5 ] >>> Reduce ( lambda x , y : x * y , a ) 120
これは
ここでの無名関数は、2 つの引数の乗算です。
fold の結果は 1 つの値である必要はありません。代わりに、fold を使用して map と filter の両方を作成できます。map では、累積される値は、元のリストの各要素に関数を適用した結果を含む新しいリストです。filter では、累積される値は、指定された条件に一致する要素のみを含む新しいリストです。
言語リスト
以下は、名前のない匿名関数を完全にサポートしている、または何らかのバリエーションとして部分的にサポートしている、あるいはまったくサポートしていない プログラミング言語のリストです。
この表は、一般的な傾向を示しています。まず、匿名関数をサポートしていない言語 ( C、Pascal、Object Pascal ) はすべて静的型付け言語です。ただし、静的型付け言語は匿名関数をサポートできます。たとえば、ML言語は静的型付けで、基本的に匿名関数を含んでおり、Object Pascalの方言であるDelphi は、 C++と同様に( C++11標準により) 匿名関数をサポートするように拡張されています。次に、関数を第一級関数として扱う言語( Dylan、Haskell、JavaScript、Lisp、ML、Perl、Python、Ruby、Scheme ) は一般に匿名関数をサポートしているため、関数を他のデータ型と同じくらい簡単に定義して渡すことができます。
匿名関数の例
参照
参考文献
- ^ 「高階関数」。learnyouahaskell.com 。 2014年12月3日閲覧。
- ^ Fernandez, Maribel (2009)、「計算モデル: 計算可能性理論入門」、学部生向けコンピュータサイエンストピックス、Springer Science & Business Media、p. 33、ISBN 9781848824348ラムダ計算は、
1930年代にアロンゾ・チャーチによって匿名関数の理論の正確な表記法として導入されました。
- ^ 「アロー関数式 - JavaScript」。MDN 。 2019年8月21日閲覧。
- ^ 「アクセスタイプ」www.adaic.org . 2024年6月27日閲覧。
- ^ 「Bash lambda」。GitHub。2019-03-08。
- ^ BillWagner. 「ラムダ式 - C# リファレンス」. docs.microsoft.com . 2020 年 11 月 24 日閲覧。
- ^ 「Closure サポート」。2014 年 1 月 6 日時点のオリジナルよりアーカイブ。2014 年 1 月 5 日閲覧。
- ^ 「ColdFusion 10 の新機能」。2014 年 1 月 6 日時点のオリジナルよりアーカイブ。2014 年 1 月 5 日閲覧。
- ^ 「Clojure - 高階関数」. clojure.org . 2022年1月14日閲覧。
- ^ 「Managed COBOL リファレンス」。Micro Focus ドキュメント。Micro Focus。2014年 2 月 25 日時点のオリジナルよりアーカイブ。2014 年2 月 25 日閲覧。
- ^ 「関数 - Dプログラミング言語」dlang.org . 2022年1月14日閲覧。
- ^ 「Dart言語のツアー」dart.dev . 2020年11月24日閲覧。
- ^ 「Delphi の匿名メソッド - RAD Studio」。docwiki.embarcadero.com。2020年 11 月 24 日閲覧。
- ^ 「関数 — Dylan プログラミング」。opendylan.org 。2022 年 1 月 14 日閲覧。
- ^ "docs/syntax". elm-lang.org . 2022年1月14日閲覧。
- ^ 「Erlang/Elixir 構文: クラッシュコース」elixir-lang.github.com . 2020 年 11 月 24 日閲覧。
- ^ 「Erlang -- Funs」. erlang.org . 2020年11月24日閲覧。
- ^ cartermp. 「ラムダ式: fun キーワード - F#」. docs.microsoft.com . 2020 年 11 月 24 日閲覧。
- ^ 「LAMBDA: 究極の Excel ワークシート関数」. microsoft.com . 2021 年 1 月 25 日. 2021 年 3 月 30 日閲覧。
- ^ 「Quotations - Factor Documentation」 。2015年12 月 26 日閲覧。
引用符は、値として使用でき、Fundamental コンビネータを使用して呼び出すことができる匿名関数 (コード スニペットを示す値) です。
- ^ “Frink”. frinklang.org . 2020年11月24日閲覧。
- ^ 「GoLang の無名関数」。GoLang Docs 2020 年 1 月 9 日。2020 年 11 月 24 日閲覧。
- ^ 「Gosu Documentation」(PDF)2013年3月4日閲覧。
- ^ 「Groovy ドキュメント」。2012 年 5 月 22 日時点のオリジナルよりアーカイブ。2012 年5 月 29 日閲覧。
- ^ 「匿名関数 - HaskellWiki」. wiki.haskell.org . 2022年1月14日閲覧。
- ^ 「Lambda」。Haxe - クロスプラットフォームツールキット。2022年1月14日閲覧。
- ^ 「関数 - JavaScript | MDN」。developer.mozilla.org 。 2022年1月14日閲覧。
- ^ 「関数 · Julia 言語」。docs.julialang.org 。2020年 11 月 24 日閲覧。
- ^ 「高階関数とラムダ - Kotlin プログラミング言語」Kotlin . 2020 年 11 月 24 日閲覧。
- ^ 「Luaでのプログラミング:6」。www.lua.org 。 2020年11月24日閲覧。
- ^ 「Mapleプログラミング:1.6:匿名関数と式 - アプリケーションセンター」。www.maplesoft.com 。 2020年11月24日閲覧。
- ^ 「匿名関数 - MATLAB & Simulink」www.mathworks.com . 2022年1月14日閲覧。
- ^ 「Maxima 5.17.1 マニュアル: 39. 関数定義」。maths.cnam.fr 。 2020年11月24日閲覧。
- ^ 「Nim マニュアル」。nim -lang.github.io。
- ^ 「コード例 – OCaml」。ocaml.org 。 2020年11月24日閲覧。
- ^ 「GNU Octave: 無名関数」. octave.org . 2020年11月24日閲覧。
- ^ 「関数リテラル」。OpenSCADユーザーマニュアル。Wikibooks 。 2021年2月22日閲覧。
- ^ 「perlsub - Perl サブルーチン - Perldoc ブラウザ」perldoc.perl.org . 2020 年 11 月 24 日閲覧。
- ^ 「PHP: 匿名関数 - マニュアル」。www.php.net 。 2020年11月24日閲覧。
- ^ 「6. 式 — Python 3.9.0 ドキュメント」。docs.python.org 。 2020年11月24日閲覧。
- ^ 「4.4 関数: lambda」。docs.racket-lang.org 。 2020年11月24日閲覧。
- ^ 「関数」. docs.raku.org . 2022年1月14日閲覧。
- ^ Sosinski, Robert (2008-12-21). 「Ruby のブロック、プロシージャ、ラムダを理解する」Reactive.IO。2014-05-31 にオリジナルからアーカイブ。2014-05-30に取得。
- ^ 「クロージャ: 環境をキャプチャできる匿名関数 - Rust プログラミング言語」. doc.rust-lang.org . 2022 年 1 月 14 日閲覧。
- ^ 「匿名関数」。Scalaドキュメント。2022年 1 月 14 日閲覧。
- ^ 「Recitation 3: Higher order functions」. www.cs.cornell.edu . 2022年1月14日閲覧。
- ^ 「クロージャ — Swift プログラミング言語 (Swift 5.5)」。docs.swift.org。
- ^ 「ドキュメント - 日常的な型」www.typescriptlang.org . 2022年1月14日閲覧。
- ^ 「関数型 - Typst ドキュメント」typst.app 。 2024 年 9 月 10 日閲覧。
- ^ ab "Projects/Vala/Tutorial - GNOME Wiki!". wiki.gnome.org . 2020年11月24日閲覧。
- ^ KathleenDollard (2021 年 9 月 15 日). 「ラムダ式 - Visual Basic」. docs.microsoft.com . 2022 年 1 月 14 日閲覧。
- ^ 「言語リファレンス/用語/匿名述語 - wiki.visual-prolog.com」。wiki.visual-prolog.com 。 2022年1月14日閲覧。
- ^ 「純粋無名関数: Wolfram言語の初歩的な入門」www.wolfram.com . 2022年1月14日閲覧。
- ^ 「ラムダ、クロージャ、そしてその間のすべて · Issue #1048 · ziglang/zig」。GitHub 。 2023年8月21日閲覧。
外部リンク
- 匿名メソッド - いつ使用すべきか? (Delphi の匿名関数に関するブログ)
- ラムダ式のコンパイル: Scala vs. Java 8
- PHP 匿名関数 PHP 匿名関数
- さまざまなプログラミング言語のラムダ関数
- Goの関数
