数学において、関数適用(または評価)とは、関数とその定義域からの入力を受け取り、その値域から対応する値を取得する行為である。この意味で、関数適用は関数抽象化の反対と考えることができる。[ 1 ]
ラムダ計算から派生したプログラミング言語( LISPやSchemeなど)や関数型言語において、これは中心的な役割を果たします。また、完全半順序における連続関数であるため、コンピュータプログラムの表示的意味論の研究においても重要な役割を担います。関数適用はホモトピー理論においても連続関数であり、実際、理論全体の基礎となっています。関数適用によって、ホモトピー変形を関数空間における連続パスとして捉えることができるのです。同様に、コンピュータプログラムの有効な変異(リファクタリング)は、スコット位相において「連続」であるものと見なすことができます。
関数の適用は通常、関数を表す変数と、括弧で囲まれた引数を並べて表されます。たとえば、次の式は、関数ƒを引数xに適用することを表しています。
場合によっては、括弧が不要な別の表記法が使用され、関数適用は単に並べるだけで表現できます。たとえば、次の式は前の式と同じとみなすことができます。
後者の表記法は、カリー化同型と組み合わせると特に便利です。関数が与えられた場合その応用は次のように表される。前述の表記法と(または議論とともに後者は、あまり一般的ではない山括弧で記述した関数を使用しています。ただし、カリー化された形式の関数は両者の主張を並置することで表現できる。、 それよりもこれは、関数適用が左結合であることに依存しています。
デジタル文書で数式表記を表現する場合、目に見えないゼロ幅のUnicode文字U+2061 FUNCTION APPLICATIONとU+2062 INVISIBLE TIMESを使用することで、関数適用を意味する連結と乗算を意味する連結を区別できます。
関数適用は、 applyまたはと呼ばれる演算子として定義できます。以下の定義による:
演算子はバッククォート(`)で表すこともできます。
演算子が優先順位が低く右結合であると理解されている場合、適用演算子を使用して式に必要な括弧の数を減らすことができます。たとえば、
次のように書き換えることができます。
これは、関数合成を用いて次のように表現することもできます。
あるいは、次のようなことも:
考慮すると定数関数を返す。
公理的集合論、特にツェルメロ・フレンケル集合論では、関数はしばしば関係として定義される() 任意のユニークなそのため。
普通は「「、そして通常はより一般的な関数表記法「「. 関数適用、より具体的には表記法「は、通常の集合論のシグネチャには含まれませんが、二項関数記号として理論に追加することができます。必要に応じて、表現力を損なうことなく定義します。[ 2 ]
どこは集合べき乗を表します。 からのすべての関数の集合に。
散文で:ドメインが存在する場合範囲そのためは関数ですにそして; または(前者の否定)そして空集合を使用するという選択いつ定義されていないのは任意であり、議論領域全体で定義された表記法を保証するためである。[ 5 ]
もし上記の双条件式の右辺の式は、任意の2つの集合に対して、式一意のオブジェクトを関連付ける:したがって、集合論の言語は定義による拡張を用いて関数適用演算を含めることができる。控えめに言って。
コンピュータプログラミングにおいて、関数適用とは、真の数学関数ではなく、プロシージャを呼び出したり実行したりすることを指す場合が多く(コンピュータプログラミングにおける関数を参照)、その動作には同様の規則が適用されます。
apply演算子に関連して、 apply関数は可変引数リストに関数を適用します。evalとapplyは、 SICPで説明されているLispのeval-applyサイクルの2つの相互依存コンポーネントです。[ 6 ]これは可変引数関数を 持つ言語でサポートされています。なぜなら、これが(コンパイル時に)不確定な数の引数を持つ関数を呼び出す唯一の方法だからです。
Common Lisp では、 applyは引数のリストに関数を適用する関数です(ここで「+」は任意の数の引数を取る可変引数関数であることに注意してください)。
(適用#' + (リスト1 2 ))同様にスキームでは:
(適用+ (リスト1 2 ))C#とJava では、可変引数は単純に配列に格納されます。呼び出し元は、可変引数の代わりに明示的に配列を渡すことができます。これは可変引数パラメーターに対してのみ可能です。リフレクションを使用せずに、可変引数ではないパラメーターに引数の配列を適用することはできません。呼び出し元が、引数のリストとして配列を使用するのではなく、配列自体を引数の 1 つとして渡したい場合、曖昧なケースが発生します。この場合、呼び出し元は、Objectコンパイラがapply解釈を使用しないように、配列をキャストする必要があります。
可変引数関数( arrayOfArgs );バージョン8でラムダ式が導入されました。関数は、関数型インターフェースを持つオブジェクトとして実装されます。このインターフェースには、静的でないメソッドが1つだけあります。標準インターフェース
関数< T , R >メソッド(およびいくつかの静的ユーティリティ関数)で構成されます。
R apply ( T para )Go言語 では、型付き可変引数は単純にスライスにまとめられます。呼び出し元は、...スライス引数に を追加することで、可変引数の代わりにスライスを明示的に渡すことができます。これは可変引数に対してのみ可能です。呼び出し元は、リフレクションを使用しない限り、可変引数ではない引数に引数の配列を適用することはできません。
s := [] string { "foo" , "bar" } variadicFunc ( s ... )JavaScript では、関数オブジェクトにはメソッドがあり、最初の引数は関数内のキーワードapplyの値、2番目の引数は引数のリストです。this
func.apply ( null , args ) ;Lua では、applyは次のように記述できます。
function apply ( f ,...) return f (...) endPerl では、配列、ハッシュ、式は、関数の引数リストなど、リストのコンテキストで評価される際に、自動的に単一のリストに「平坦化」されます。
# 同等のサブルーチン呼び出し: @args = ( @some_args , @more_args ); func ( @args );func ( @some_args , @more_args );PHP では、apply次のように呼ばれますcall_user_func_array。
call_user_func_array ( 'func_name' , $args );PythonとRuby では、可変引数関数を定義する際に使用されるのと同じアスタリスク表記が、それぞれシーケンスと配列に対して関数を呼び出す際に使用されます。
func (* args )Pythonには元々apply関数がありましたが、2.3でアスタリスクが推奨されるようになり、3.0で削除されました。 [ 9 ]
R 言語では、do.call関数名または関数と、それに渡す引数のリストから関数呼び出しを構築して実行します。
f ( x1 , x2 ) # do.call ( what = f , args = list ( x1 , x2 ))を介して実行することもできますSmalltalk では、ブロック(関数)オブジェクトにはvalueWithArguments:、引数の配列を受け取るメソッドがあります。
aBlock valueWithArguments: argsTcl 8.5 以降、[ 10 ]関数はapplyコマンドを使用して引数に適用できます。
関数を適用しますか?引数1引数2 ... ?ここで、関数は2要素のリスト{args body}または3要素のリスト{args body namespace}です。
関数を考えるつまり、括弧表記はは、 AからBへの関数の空間を表します。カリー化によって、一意の関数が存在します。次に、Applyは普遍射を提供する。
となることによって
あるいは、同等に、通勤図がある。
より正確には、curry と apply は随伴関数です。
表記法AからBへの関数の空間については、コンピュータサイエンスではより一般的に見られます。しかし、圏論では、は指数オブジェクトとして知られており、次のように表記されます。他にも一般的な表記上の違いがあります。たとえば、Apply は Eval と呼ばれることがよくありますが [ 11 ]、コンピュータサイエンスではこれらは同じものではなく、eval は関数を引数に適用するのではなく、関数の引用符付き文字列形式とその引数の評価であるという点で Apply と区別されます。
また、圏論では、カレーは一般的に次のように表される。、 となることによってはカレー(g)を表すために書かれています。この表記法は、ラムダ計算では、ラムダは束縛変数を表すために用いられる。これらの表記法の変更をすべて考慮すると、Applyとcurryの随伴性は可換図で表現される。

指数オブジェクトとデカルト閉圏に関する記事では、このアイデアの圏論的定式化についてより正確な議論が提供されています。したがって、ここでラムダを使用しているのは偶然ではありません。デカルト閉圏の内部言語は、単に型付きラムダ計算です。Applyの最も一般的な設定は、閉モノイド圏であり、デカルト閉圏はその一例です。ホモロジー代数では、curry と apply の随伴性は、テンソルホム随伴として知られています。
順序理論において、スコット位相を備えた完全半順序のカテゴリーでは、curryとapplyはどちらも連続関数である(つまり、スコット連続である)。[ 12 ]この性質は、コンピュータプログラムの表示的意味論 の研究の基礎的な妥当性を確立するのに役立つ。
代数幾何学とホモトピー理論では、curryとapplyは空間が一定の場合に連続関数となる。連続関数からにコンパクトな開トポロジーが与えられ、これは局所的にコンパクトなハウスドルフ空間である。この結果は、ホモトピー理論の基礎となるものであり、ホモトピー変形を関数空間における連続的な経路として理解することを可能にするため、非常に重要である。
カリー・ハワード対応は、関数適用をモーダス・ポネンスの論理規則に関連付けている。