コンピュータサイエンスにおいて、部分適用(または部分関数適用)とは、関数の引数の数を固定して、引数の数が少ない別の関数を生成するプロセスを指します。、最初の引数を固定(または「バインド」)して、次の型の関数を生成することができます。この関数の評価は次のように表すことができます。なお、この場合、部分関数適用によって得られる結果は、2つの引数を取る関数となります。部分適用は、関連はあるものの異なる概念である「カリー化」と誤って呼ばれることがあります。
直感的に言えば、部分関数適用とは「関数の最初の引数を固定すると、残りの引数の関数が得られる」ということです。例えば、関数div ( x , y ) = x / yの場合、パラメータxを1 に固定したdiv は別の関数になります。div 1 ( y ) = div ( 1, y ) = 1/ y 。これは、引数の乗法逆数を返す関数inv ( y ) = 1/ yと同じです。
部分適用の実際的な動機は、関数に引数の一部のみを与えることで得られる関数が非常に有用であることが多いという点にあります。例えば、多くのプログラミング言語には、 に似た関数や演算子がありますplus_one。部分適用を用いることで、これらの関数を簡単に定義できます。例えば、最初の引数として 1 を境界値とする加算演算子を表す関数を作成するなどです。
ML、Haskell、F#などの言語では、関数はデフォルトでカリー化されています。引数の総数よりも少ない数を指定することを部分適用と呼びます。
第一級関数を持つ言語では、カリー化と部分適用を明示的に実行するためにcurry、、、uncurryを定義できます。これは追加のクロージャpapplyの作成により実行時のオーバーヘッドが大きくなる可能性がありますが、Haskell はより効率的な手法を使用できます。[ 1 ]
Scala は、プレースホルダーを使用したオプションの部分適用を実装しています。たとえば、インクリメント関数を返します。Scala は、カリー化として複数のパラメータ リストもサポートしています。defadd(x:Int,y:Int)={x+y};add(1,_:Int)defadd(x:Int)(y:Int)={x+y};add(1)_
Clojureはpartial、コアライブラリで定義されている関数を使用して部分適用を実装しています。 [ 2 ]
C ++標準ライブラリでは、指定された引数を指定された関数に部分適用した結果である関数オブジェクトbind(function, args..)を返す機能を提供しています。C ++20以降では、関数の最初の引数をargsにバインドする関数も提供されています。これに対し、は、渡された関数の最初の引数だけでなく、任意の引数をバインドできます。あるいは、ラムダ式を使用することもできます。bind_front(function, args...)sizeof...(args)bind
int f ( int a , int b ); auto f_partial = []( int a ) { return f ( a , 123 ); }; assert ( f_partial ( 456 ) == f ( 456 , 123 ) );Javaでは、MethodHandle.bindTo関数を最初の引数に部分的に適用します。[ 3 ] あるいは、Java 8以降ではラムダ式を使用できます。
public static < A , B , R > Function < B , R > partialApply ( BiFunction < A , B , R > biFunc , A value ) { return b -> biFunc . apply ( value , b ); }Rakuでは、このassumingメソッドはパラメータの少ない新しい関数を作成します。[ 4 ]
Python標準ライブラリモジュールには、位置引数と名前付き引数のバインディングを可能にし、新しい関数を返す関数が含まfunctoolsれています。 [ 5 ]partial
XQueryでは、?部分関数適用における固定されていない引数ごとに引数プレースホルダー( )が使用されます。 [ 6 ]
関数型と積型( λ →, × ) の部分適用を持つ単純型ラムダ計算では、カリー化と非カリー化は次のように定義できます。
papplycurryuncurrycurrypapply=であることに注意してくださいcurry。
部分適用は、数学におけるいくつかの有用な概念を定義する上で有効な方法となり得る。
与えられた集合そして、そして関数関数を定義することができる
どこ関数の集合. のイメージこの地図の下にはこれは送信する関数ですに構造物がよくありますつまり、関数のサブセットに制限する以下の例に示すように。
グループアクションは関数として理解できる部分的な評価全単射のグループに制限するそれ自体に対して。グループ作用の公理はさらに、は群準同型です。
ベクトル空間上の内積野原を越えて地図部分評価により、双対ベクトル空間への正準写像が得られます。これがヒルベルト空間の内積である場合、リース表現定理により、これは同型であることが保証されます。
クロス積の部分適用の上はベクトルの画像線形マップそのため. の構成要素見つけることができる。
これはリー代数の随伴写像と密接に関係している。リー代数には括弧が備わっている。部分適用によりマップが得られます括弧の公理により、この写像はリー代数の準同型写像であることが保証されます。