TL;DR

関数の引数の一部を固定して、引数の少ない(アリティの小さい)別の関数を作ること。カリー化と混同されやすいが、別の概念である。

なぜ必要か

Domain Modeling Made Functional 第8章 によると、部分適用はワークフローの実装で依存性の注入を行うときに使われる。サービスを部分適用してワークフローを組み立てれば、残りの引数だけを受け取る関数として扱える。

仕組み

Wikipedia によると、部分適用は既存の関数の引数の一部を固定する。一方、カリー化は、複数の引数を取る関数を、1 引数の関数の連なりに変換する。たとえば、div(x, y) = x / y の x を 1 に固定すると、1 引数の関数 div1(y) = 1 / y になる。これは逆数を求める関数と同じである。

例

F# の関数はすべてカリー化されているので、複数のパラメータを取る関数に引数を 1 つだけ渡すと、残りのパラメータを受け取る新しい関数が返る。

let sayGreeting greeting name =
    printfn "%s %s" greeting name
 
let sayHello = sayGreeting "Hello"
 
sayHello "Alex"

Effect の多くの API は、引数をまとめて渡す書き方と、部分適用する書き方の両方に対応している(Dual API)。

関連

出典