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)。