コンテンツにスキップ

Chapter 0: 二項演算の再評価と戦略

これまでのユニットやセクションで、我々は強力なツール群を構築してきた。mapで単一のタイムラインを変換し、bindで逐次的な依存チェーンを生成し、scanで時間とともに状態を持つ変換を管理できるようになった。

しかし、我々は今、全く新しい挑戦に直面している。それは、並行して実行される複数の独立したタイムラインを合成することだ。「2つの別々のカウンターの最新値を足し合わせる」や「2つの異なるフォーム入力が両方とも有効かチェックする」といったタスクを考えてみてほしい。これらのシナリオは、既存のプリミティブだけでは直接解決できない。

今我々が必要としているのは、2つの独立したソースTimeline<'a>Timeline<'b>を受け取り、新しいTimeline<'c>を生成する、汎用的な二項演算である。

この問題を解決するため、Unit 4で学んだApplicative Functorの分類を再訪しよう。

  1. デカルト積 (Cartesian): Listの文脈では、このアプローチは要素の全ての可能な組み合わせを生成した。これをTimelineに適用すると、timelineAの過去の全イベントとtimelineBの過去の全イベントを組み合わせることを意味する。これは計算量的に爆発的であり、現在の合成された状態を決定するという我々の目標とは一致しない。したがって、デカルト積アプローチは不適切である。

  2. Pointwise: Listでは、このアプローチはzip操作のように同じインデックスの要素をペアにした。しかし、Timelineには同期された「インデックス」という概念は存在しない。タイムラインは非同期であり、時刻t1timelineA上のイベントが、全く同じ時刻t1timelineB上に対応するイベントがあるという保証はない。同期された時間の「点」に基づく厳密なzipのような合成は、実質的に役に立たないだろう。したがって、同期的な構造に対して定義されたPointwise分類もまた不適切である。

新しい概念の必要性:「最新値の組み合わせ」

Section titled “新しい概念の必要性:「最新値の組み合わせ」”

Unit 4の分類が適合しないため、Timelineの非同期的な性質に合わせた新しい概念が必要となる。

我々が本当に必要としているのは、離散的なイベント(点)を同期させることではなく、継続的に利用可能な状態を組み合わせることだ。これは我々に新しい概念、「最新値の組み合わせ (Latest Value Combination)」 を提案させる。

この考えは次のように定義される。

いずれかのソースタイムラインが更新された瞬間、その新しい値は、他のソースの最も最近知られている値(最新の状態)と組み合わされ、新しい結果を生成する。

この強力なモデルは、入力の非同期的な性質を完全に受け入れつつ、一貫した合成状態が常に利用可能であることを保証する。これはリアクティブシステムに特有のパターンである。