0Pricing
TypeScript Academy · レッスン

エフェクトの合成

pipeとジェネレーターでエフェクトを連鎖・結合します。

「エフェクトの合成」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。

エフェクトを合成する

エフェクトは値なので、エフェクトを合成してプログラムを構築します。中心となるツールは Effect.pipe、Effect.map、Effect.flatMap、そしてジェネレーターを基にした Effect.gen 構文です。

pipe: 関数に順番に渡す

pipe はエフェクトを一連の変換に左から右へ渡すため、深いネストを避けられます。

import { Effect, pipe } from "effect";

const program = pipe(
  Effect.succeed(2),
  Effect.map((n) => n + 1),
  Effect.map((n) => n * 10)
);
// Effect<number, never, never> producing 30

map: 成功値を変換する

Effect.map は成功値に純粋な関数を適用し、エラーと要求のチャネルはそのまま維持します。

import { Effect } from "effect";

const doubled = Effect.map(Effect.succeed(21), (n) => n * 2);
// Effect<number, never, never>

flatMap: エフェクトを順番に実行する

次のステップ自体がエフェクトの場合は、flatMap(chain とも呼ばれます)を使います。最初のエフェクトを実行し、その値を別のエフェクトを返す関数に渡します。

import { Effect, pipe } from "effect";

const getId = Effect.succeed(1);
const loadUser = (id: number) => Effect.succeed({ id, name: "Ada" });

const program = pipe(getId, Effect.flatMap(loadUser));
// Effect<{ id: number; name: string }, never, never>

map と flatMap の違い

関数が通常の値を返す場合は map を使い、エフェクトを返す場合は flatMap を使います。エフェクトを返す関数に map を使うと、ネストしたエフェクトが残ります。

チャネルは蓄積される

エフェクトを順番に実行すると、エラー型は共用体にまとめられ、要求も共用体にまとめられます。合成後の型には、失敗する可能性があるものと必要なものがすべて反映されます。

// Effect<A, E1, R1> then Effect<B, E2, R2>
// => Effect<B, E1 | E2, R1 | R2>

Effect.gen: ジェネレーター構文

Effect.gen を使うと、async/await のように読める逐次的なエフェクトコードを書けます。各エフェクトの値を取り出すには yield* を使います。

import { Effect } from "effect";

const program = Effect.gen(function* () {
  const id = yield* Effect.succeed(1);
  const user = yield* Effect.succeed({ id, name: "Ada" });
  return user.name;
});
// Effect<string, never, never>

gen と pipe の違い

gen は、中間変数を使う直線的な複数ステップの処理に適しています。pipe は短い変換チェーンで力を発揮します。両者は自由に組み合わせられます。

独立したエフェクトを組み合わせる

Effect.all は複数のエフェクトを実行して結果をまとめ、すべてのエフェクトのエラーと要求を蓄積します。

import { Effect } from "effect";

const both = Effect.all([Effect.succeed(1), Effect.succeed("x")]);
// Effect<[number, string], never, never>

遅延性は変わらない

ここまでの処理は、プログラムを記述しているだけです。Effect.runPromise や Effect.runSync を使って最後に実行するまで、何も実行されません。

import { Effect } from "effect";
// const result = await Effect.runPromise(program);

なぜ重要なのか

エフェクトの合成によって、エフェクトが実用的なものになります。小さく型付けされた部品を組み合わせて大きなプログラムを作りながら、コンパイラーがすべてのエラーと依存関係を追跡します。map、flatMap、pipe、genは、Effect コードで日常的に使う操作です。

理解度チェック

エフェクトの合成について、理解度を確認しましょう。

まとめ

エフェクトは、map(成功した値を変換する)、flatMap(エフェクトを返す処理を順番に実行する)、pipe(変換処理に値を順番に渡す)、Effect.gen(await に似たジェネレーター構文)を使って合成します。エラーと要件のチャネルはユニオンとして蓄積され、末端で実行するまで何も実行されません。

よくある質問

「エフェクトの合成」レッスンは無料ですか?

はい。「エフェクトの合成」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。

「エフェクトの合成」で何を学びますか?

pipeとジェネレーターでエフェクトを連鎖・結合します。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

TypeScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「エフェクトの合成」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このTypeScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

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

  1. エフェクトシステムが重要な理由
  2. Effect型
  3. エフェクトの合成
  4. エラーチャネルと依存関係
← TypeScript Academyに戻る