0Pricing
TypeScript Academy · レッスン

型付き関数合成

型安全性を保ちながら関数を合成します。

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

関数合成とは

関数合成は、小さな関数を組み合わせて大きな関数を作ります。compose(f, g)は、まずgを適用し、その結果をfに渡す関数を生成します。

基本的な定義

数学的にはcompose(f, g)(x) = f(g(x))です。関数は右から左に実行され、最も右の関数が最初に実行されます。

const compose = (f: (n: number) => number, g: (n: number) => number) =>
  (x: number) => f(g(x));
const inc = (n: number) => n + 1;
const dbl = (n: number) => n * 2;
console.log(compose(inc, dbl)(5)); // 11 (5*2 then +1)

右から左への順序

順序が重要です。compose(inc, dbl)は先に2倍してから1を加えます。一方、compose(dbl, inc)は先に1を加えます。関数合成は内側から外側へ読みます。

console.log(compose(dbl, inc)(5)); // 12 (5+1 then *2)

ジェネリクスで関数合成を型付けする

ジェネリクスを使うと、入力型と出力型を異なるものにできます。gはAをBに変換し、fはBをCに変換します。その結果はAをCに変換します。

function compose<A, B, C>(f: (b: B) => C, g: (a: A) => B): (a: A) => C {
  return a => f(g(a));
}

途中で型を変える

ジェネリクスがA -> B -> Cと連鎖するため、関数合成では、文字列から数値、さらに文字列へ変換するように、値を複数の形に変換できます。

const length = (s: string) => s.length;
const toStr = (n: number) => "len=" + n;
const describe = compose(toStr, length);
console.log(describe("hello")); // len=5

型の境界を一致させる必要がある

gの出力はfの入力と一致しなければなりません。一致しない場合、コンパイラーは関数合成を拒否し、接続の間違いを早期に検出します。

// compose(length, toStr) would error:
// toStr returns string, length expects string -> ok here,
// but mismatched pairs are flagged by the compiler.

3つの関数を合成する

関数合成を入れ子にすることも、3引数版を書くこともできます。どの場合でも、右から左へのルールが適用されます。

const compose3 = <A, B, C, D>(
  f: (c: C) => D, g: (b: B) => C, h: (a: A) => B
) => (a: A): D => f(g(h(a)));
const inc = (n: number) => n + 1;
const dbl = (n: number) => n * 2;
const neg = (n: number) => -n;
console.log(compose3(neg, dbl, inc)(3)); // -8

関数合成でパイプラインを作る

小さく純粋な関数を合成すると、複雑な変換を宣言的に組み立てられます。それぞれの要素を単独でテストできます。

const trim = (s: string) => s.trim();
const upper = (s: string) => s.toUpperCase();
const clean = compose(upper, trim);
console.log(clean("  hi ")); // HI

純粋関数が最も合成しやすい理由

関数合成では、それぞれの関数が入力だけに依存することを前提とします。純粋関数はこれを保証するため、それらを合成すると、予測可能な別の純粋関数が得られます。

compose と pipe の違い

composeは右から左に実行され、数学の記法に対応します。左から右に読むほうが好まれることも多く、その読み方を提供するのがpipeです。詳しくは次に説明します。

各要素を小さく保つ

各関数が小さな1つの処理だけを担当すると、関数合成の効果が発揮されます。小さく名前の付いた純粋なステップによって、合成されたパイプラインは自己文書化され、簡単に並べ替えられます。

クイックチェック

このレッスンの理解度を確認します。

まとめ

compose(f, g)(x) = f(g(x))は右から左に実行されます。ジェネリック型はA -> B -> Cと連鎖するため、gの出力はfの入力と一致する必要があります。これにより、コンパイラーは小さな純粋関数で構成されたパイプラインを検証できます。

よくある質問

「型付き関数合成」レッスンは無料ですか?

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

「型付き関数合成」で何を学びますか?

型安全性を保ちながら関数を合成します。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「型付き関数合成」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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