Chapter 1: map — 静的な依存グラフ
Timeline
で最も基本的で頻繁に使われる変換操作が.map()
です。これは、あるTimeline
の値を、特定のルール(関数)に従って別の値に変換し、新しいTimeline
を生成します。
その本質は、2つのTimeline
の間に、不変で「静的な」関係性を定義することです。
F#: map: ('a -> 'b) -> Timeline<'a> -> Timeline<'b>
Section titled “F#: map: ('a -> 'b) -> Timeline<'a> -> Timeline<'b>”TS: .map<B>(f: (value: A) => B): Timeline<B>
Section titled “TS: .map<B>(f: (value: A) => B): Timeline<B>”map
は、型A
の値を受け取って型B
の値を返す純粋な関数f
を引数に取ります。
TypeScript
const numbers = Timeline(5);
// (x: number) => string という関数を渡すconst labels = numbers.map(x => `Score: ${x}`);
console.log(labels.at(Now)); // "Score: 5"
// ソースを更新すると、labelsも自動的に更新されるnumbers.define(Now, 100);console.log(labels.at(Now)); // "Score: 100"
依存グラフ (Dependency Graph)
Section titled “依存グラフ (Dependency Graph)”map
を呼び出すと、内部では2つのTimeline
の間に依存関係 (Dependency) が登録されます。この関係性のネットワーク全体を依存グラフと呼びます。
map
が作る依存関係は静的 (Static) です。一度labels = numbers.map(...)
という関係を定義したら、numbers
とlabels
の間の「値を変換する」というルールそのものが後から変わることはありません。
このシンプルな「静的な依存関係」の概念が、後に出てくるbind
やusing
が構築する「動的な」依存関係を理解するための基礎となります。