純粋関数と不変性
副作用のない、予測可能な関数を記述します。
「純粋関数と不変性」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。
純粋関数とは
純粋関数は、同じ入力に対して同じ出力を返し、副作用を持ちません。外部状態の読み書き、引数の変更、I/Oを行いません。
純粋関数の例
この関数は引数だけに依存し、返り値だけを生成します。呼び出しても、外部の何かが変更されることはありません。
function add(a: number, b: number): number {
return a + b;
}
console.log(add(2, 3)); // 5, always不純な関数の例
この関数はスコープ外の変数を読み取り、変更しています。そのため結果が隠れた状態に依存し、実行した痕跡も残ります。これが不純な関数である理由です。
let counter = 0;
function next(): number {
counter += 1; // side effect
return counter;
}
console.log(next(), next()); // 1 2, depends on history参照透過性
純粋な呼び出しは参照透過です。プログラムを変えずに、呼び出しをその結果で置き換えられます。どの場所でもadd(2, 3)を5に置き換えられます。
const x = add(2, 3) * 2;
const y = 5 * 2; // identical meaning
console.log(x === y); // true純粋性が役立つ理由
純粋関数は、セットアップなしで簡単にテストでき、キャッシュしやすく、並列実行しても安全です。また、隠れた依存関係がないため、動作を簡単に理解できます。
引数を変更しない
入力の配列やオブジェクトを変更すると、呼び出し側が予期していない副作用になります。代わりに新しい値を構築して返してください。
// Impure: mutates input
function pushImpure(xs: number[], v: number) { xs.push(v); return xs; }
// Pure: returns a new array
function pushPure(xs: number[], v: number): number[] { return [...xs, v]; }スプレッドによる不変更新
スプレッド演算子はオブジェクトや配列をコピーし、元の値に触れずにフィールドを上書きできるようにします。これはTSで不変更新を行う際の基本的な手法です。
interface User { name: string; age: number }
function birthday(u: User): User {
return { ...u, age: u.age + 1 };
}
const before = { name: "Ada", age: 30 };
const after = birthday(before);
console.log(before.age, after.age); // 30 31配列を不変的に更新
変更する代わりに、map、filter、スプレッドを使って新しい配列を作成してください。元の配列はそのまま残るため、ほかのコードから引き続き利用できます。
const nums = [1, 2, 3];
const doubled = nums.map(n => n * 2);
console.log(nums, doubled); // [1,2,3] [2,4,6]安全性のためのreadonly
パラメーターにreadonlyを付けると、関数がそれらを変更しないことをコンパイラーと読み手に伝えられます。これにより、型レベルで純粋性を強化できます。
function sum(xs: readonly number[]): number {
return xs.reduce((a, b) => a + b, 0);
}
console.log(sum([1, 2, 3])); // 6副作用を境界へ押し出す
現実のプログラムには、ロギングやネットワーク通信などの副作用が必要です。関数型のスタイルでは、コアを純粋に保ち、境界部分に副作用を隔離します。そのため、コードの大部分を予測しやすくできます。
考え方のチェックリスト
各関数について、次の点を確認してください。入力だけに依存していますか。値だけを返していますか。入力や外部の状態を変更せずに済んでいますか。3つとも「はい」なら、その関数は純粋です。
簡単な確認
このレッスンの簡単な確認です。
まとめ
純粋関数は入力だけに依存し、副作用を生成しないため、参照透過性をもたらします。不変更新にはスプレッド、map/filter、readonlyを使い、現実世界との副作用はプログラムの境界に押し出してください。
AI チューターと学ぶ TypeScript — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 101
- レッスン
- 352
よくある質問
「純粋関数と不変性」レッスンは無料ですか?
はい。「純粋関数と不変性」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。
「純粋関数と不変性」で何を学びますか?
副作用のない、予測可能な関数を記述します。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
TypeScript Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「純粋関数と不変性」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このTypeScript Academyレッスンでコードを書いて実行できますか?
はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。