TypeScript Academy · レッスン

純粋関数と不変性

副作用のない、予測可能な関数を記述します。

レッスン 1/413 ステップ

「純粋関数と不変性」は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フィードバックを取得できます。ローカル設定は不要です。

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

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