イベントの種類

リアクティブプログラミングでは外部とのやりとりを、外部の「何か」と対応付けられた振る舞いを通じて行います。
対応付けたい内容に応じて、いくつかの種類の振る舞いを使い分けることが必要になります。

状態へのマッピング

もっとも基本的な振る舞いは、単純に外部の状態と対応付けられた振る舞いです
たとえばGUIやHTMLのテキストフィールド、チェックボックス、スライダーなどがもつ値、マウスの現在位置などを
振る舞いとして扱うことです。
モデルのもつ状態とテキストフィールドの状態を関係付ければ、そのまま入出力が実現できます。
Excelのセルもひとつの振る舞いだと考えることもできます。
シミュレーションであれば、温度などのセンサーからの入力値や、電流値、電圧値なども振る舞いとして扱います。

時間へのマッピング

もうひとつの方法は、システム時刻などを振る舞いとして扱うことです。
時刻は当然、外部から入力がなくても自動的に変化していきます
これを振る舞いとして扱うことで、アニメーションやシミュレーションを行うことができます。
たとえば、
bee = render("bee.jpg", x=sin(t), y=cos(t))
とすれば、円を描くアニメーションをさせることができます。
微分積分の演算が提供されていれば、加速度をもつ物体のシミュレーションなどができます。

入力ストリームへのマッピング

状態や時間に対応した振る舞いだけでは、離散的なイベントを扱うことができません。
マウスがクリックされている状態を扱うのではなく、
マウスがクリックされたタイミングで何かを行うには、
マウスのクリックをイベントとして扱う必要があります。
リアクティブプログラミングでは、これらは一般的に離散的なイベントのストリームとして扱います。
たとえばクリックされた回数を数えるには、
mouseClick.count()
とします。ここで、数えた回数自体は、時間変化する値を持つ通常の振る舞いになります。
イベントストリームの処理は、リストの処理などと同様に、フィルタリングや合成を行うことができます。
(mouseClick + keyPress).count()
とすれば、マウスのクリックとキープレスのイベントの両方を数えることができます。
また、マウスの左クリックだけを数える場合はフィルタリングを使って次のようにかけるでしょう。
mouseClick.filter(lambda e:e.key == "left").count()
イベントストリームからイベントストリームを生成することもできます。
たとえば、マウスがクリックされたらアラートを表示するには次のようになるでしょう。
mouseClick.alert()

イベントストリームは、振る舞いとは別のものとして扱われることが多いですが、
見方を変えれば、イベントストリームは「イベントの履歴」という値の振る舞いだと考えることもできます。