0Pricing
TypeScript Academy · レッスン

カリー化と部分適用

複数引数の関数をカリー化された形に変換します。

「カリー化と部分適用」は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 0

mapや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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 純粋関数と不変性
  2. カリー化と部分適用
  3. 型付き関数合成
  4. 型付きpipeとflowユーティリティ
← TypeScript Academyに戻る