Erik Meijer氏とWes Dyer氏はLINQ to Eventsを使用可能にする、.NETリアクティブフレームワーク(Rx)を作成した。リアクティブフレームワークはLINQ to Objectsの(数学的な意味の)双対である。Erik氏と氏Brian Beckman氏はIObservableが継続モナドであることを実証した。
リアクティブプログラミング自体は新しいものというわけではなく、すでにCommon Lispのデータフロー拡張としてCellsで使われているし、Trellisでも高次リアクティブプログラミングサポートのためのPython拡張機能として使われている。C#では、非同期処理のコールバックやイベントハンドラとしてリアクティブプログラミングが使われている。非同期処理終了時、もしくはイベント発生時にメソッドが呼び出され、イベントへのリアクションとして実行される。
LINQ to Objectsはデータコレクションの反復処理を行うためにIEnumerableとIEnumeratorインターフェースを使用する。反復子(Enumerator)のMoveNextメソッドはある要素から次の要素へ移動するために使われ、Currentプロパティは現在の要素を取得するために使われる。反復子のメカニズムはシンプルで、よく知られ、広く利用されている“プル”プロセスを使っている。Erik氏はIEnumerableが、コレクションからデータを取り出せる時、そのコレクションにデータを追加することもできる、という双対性を持っていることを発見した。これはリアクティブプログラミングへのもうひとつのアプローチである。
理論上、IEnumerableインターフェースはコレクションへのオブジェクトの追加に使えるが、非同期処理に使うことができない。彼らのチームがIObservableとIObserverという2つの新たなインターフェースを導入したのは、これが理由である。誰でもIObserverをデータのコレクションに割り当て、それをIObserverに登録することができる。新しいデータが利用可能になったら、そのデータはIObservable経由で順にIObservableに渡され、コレクションにプッシュされる。Microsoftのプレゼンテーションプラットフォームコントロールチームの開発者であるJafar Husain氏は、どのようにIObserverパターンが使われるかを次のように説明した。
IObservableを詳しく検討するために、IEnumerableの動作を逆にして考えてみましょう。まずIObserverを生成し、それにIObservableを渡します。そして、IObservableがIObserverにデータを“プッシュ”します。IObservableがObserverの“OnUpdate”メソッドを呼び出すことは、IEnumerableに情報を与えるためのyieldキーワードに相当します。同様に、IObservableがObserverの“OnCompleted”メソッドを呼び出すことは、IEnumrableでもうこれ以上データがないことを表すbreakキーワードに相当します。
これの何がよいのかというと、イベントハンドリングに役に立つようだ。例えば、IObserverをマウスイベントにアタッチし、それらをコレクションに非同期的に記録する。そして、LINQを使ってそのデータを反復処理することができる。GUIイベントのハンドリングでの威力を示すため、リアクティブフレームワークはSilverlight Toolkitの単体テストに使用され、System.Reactive.dllにパッケージされてソースコードに含まれている。リアクティブフレームワークは.NET 4.0にも含まれるだろう。
ソフトウェアアーキテクトで宇宙物理学者のBrian Beckman氏はErik Meijer氏とのビデオインタビューの中で、IObservableがIEnumerableモナドの双対の、継続モナドであることを実証した。Erik氏はIObservableインターフェースがIEnumerableの双対化によって生み出された過程についても説明している。