カリー化と部分適用
複数引数の関数をカリー化された形に変換します。
「カリー化と部分適用」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。
カリー化とは
カリー化は、複数の引数を取る関数を、1つの引数を取る関数のチェーンに変換します。f(a, b)の代わりにf(a)(b)と呼び出します。
典型的な例
ここでaddは1つの数値を受け取り、次の数値を待つ関数を返します。TypeScriptは、入れ子になった関数の型を自動的に推論します。
const add = (a: number) => (b: number) => a + b;
console.log(add(2)(3)); // 5カリー化された関数の型付け
明示的な型によって、関数が関数を返すというチェーンを明確に示せます。各矢印は1つの引数に対応します。
type Add = (a: number) => (b: number) => number;
const add: Add = a => b => a + b;
console.log(add(10)(5)); // 15部分適用
部分適用は、一部の引数を先に固定し、残りを後から渡す手法です。カリー化された関数では、単に少ない段階で呼び出すだけで実現できます。
const add = (a: number) => (b: number) => a + b;
const add10 = add(10); // partially applied
console.log(add10(1), add10(2)); // 11 12部分適用が役立つ理由
汎用的な関数から特化した関数を作成できます。add10は、汎用的なaddから派生した、再利用可能で名前の付いたツールです。読みやすさと再利用性が向上します。
3つの引数のカリー化
このパターンは、引数の数に関係なく拡張できます。各レベルがクロージャーに1つの引数を保持し、最後の値が生成されるまで続きます。
const clamp = (min: number) => (max: number) => (x: number) =>
Math.min(Math.max(x, min), max);
const toByte = clamp(0)(255);
console.log(toByte(300), toByte(-5)); // 255 0mapやfilterに最適
カリー化された関数は、配列メソッドに自然に組み込めます。mapは1つの引数を取る関数を想定しているため、部分適用によってまさにその形を作れます。
const mul = (a: number) => (b: number) => a * b;
const triple = mul(3);
console.log([1, 2, 3].map(triple)); // [3, 6, 9]汎用的なカリー化ヘルパー
2つの引数を取る関数をカリー化する、型付きのヘルパーを作成できます。ジェネリックによって、引数と返り値の型を正確に保てます。
function curry2<A, B, R>(f: (a: A, b: B) => R) {
return (a: A) => (b: B) => f(a, b);
}
const join = curry2((a: string, b: string) => a + b);
console.log(join("foo")("bar")); // foobarクロージャーによる引数の捕捉
カリー化が機能するのは、返された各関数が以前の引数をクロージャーとして保持するためです。それらの値は、最後の呼び出しで使われるまで保持されます。
const greet = (greeting: string) => (name: string) =>
greeting + ", " + name;
const hi = greet("Hi");
console.log(hi("Sam")); // Hi, Samカリー化しないほうがよい場合
すべての関数をカリー化すると、読みやすさが損なわれることがあります。再利用可能なヘルパーの設定やパイプラインの組み立てなど、部分適用が本当に役立つ場合に使ってください。
カリー化とデフォルト引数の違い
デフォルトパラメーターは初期値を提供しますが、段階的な適用は行いません。カリー化では本当の部分適用が可能になり、受け渡しや再利用ができる実際の関数が返されます。
クイックチェック
このレッスンの理解度を確認します。
まとめ
カリー化はf(a, b)をf(a)(b)に変換します。これは、入れ子になったアロー関数として型付けされた、1引数関数のチェーンです。部分適用では、先頭の引数を固定して再利用可能な特化関数を作成します。これはクロージャによって実現されます。
よくある質問
「カリー化と部分適用」レッスンは無料ですか?
はい。「カリー化と部分適用」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。
「カリー化と部分適用」で何を学びますか?
複数引数の関数をカリー化された形に変換します。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
TypeScript Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「カリー化と部分適用」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このTypeScript Academyレッスンでコードを書いて実行できますか?
はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 純粋関数と不変性
- カリー化と部分適用
- 型付き関数合成
- 型付きpipeとflowユーティリティ