上記の質問に対する答えは、最初の仮定が間違っている可能性があるということだと思います。観測可能なシーケンスは、(より)動作とシグナルに類似していると思います(連続時間で変化し、無限になる可能性があり、デフォルトで同期します)。Conal は、イベントが特定の時点での特定の状態であることを示しているようです。たとえば、「時間 t0 の後に最初に左ボタンが押されたことを示すイベント」などの「ハプニング」です [*1]。
|Rx |Conal |ELM |
|--------------|--------|------|
|T |Event | ? |
|IObservable<T>|Behavior|Signal|
Conal の説明にあるイベントは、ある時点での実際の値だと思います。より具体的に言えば、これはさらに正確だと思います
|Rx |Conal |ELM |
|---------------------------|--------|------|
|TimeStamp<T> |Event | ? |
|ReplaySubject<TimeStamp<T>>|Behavior|Signal|
ここでは、ReplaySubject<TimeStamp<T>>
私が理解しているように、動作をより密接に表していると思います (状態と時間を含み、ある時点で値を取得できます)。ただし、ReplaySubject
特定の時点から状態をプルすることは実際には許可されていないため、同じものではありません。私の意見では、EventStore の方がより適しています。
明確にするために、私の理解では、Observable Sequence (Rx IObservable<T>
) と Conal の動作は、ある程度までは同様の定義を共有しています。どちらも、時間の経過とともに順序付けられた一連の値を表します。ただし、Rx では、これが観測可能なシーケンスのすべてです。Rx は純粋に、イベントのストリームを照会できるようにするためのライブラリであることを思い出してください。Replay
データをキャッシュしたり ( / Buffer
)、データのウィンドウを操作したり ( Window
/ GroupJoin
)、タイムスタンプ ( TimeStamp
/ ) を使用してデータを強化したりできる機能がいくつかありますTimeInterval
。
ただし、Conal のビヘイビアが Observable Sequences と異なる点は、永続性と履歴クエリの機能にあります。私が理解しているように、Rx の機能に加えて Conal の動作は、任意の時点でシーケンスの値を取得できることも指定しています。たとえば、時間 00:00:01 に $1.23 の価格ティックがあり、時間 00:00:05 に $2.34 の別の価格ティックがあった場合、消費者は時間 00:00:02 に値を要求でき、与えられます。 $1.23 の値 (その時点での最新の値) を戻します。
time [t1 ] [t2] [t3] [t4] [t5 ]
prices ----[$1.23]--------------------[$2.34]--->
price@t2 -------------[$1.23]|
Rx はこれをサポートしていませんが、これをサポートするためにカスタム オペレータを作成するために多大な努力を払うことができます。
//A forced example of querying historical data.
// Be carefull as Replay() uses an unbounded buffer!
var source = Observable.Interval(TimeSpan.FromMilliseconds(250))
.Timestamp()
.Replay();
var connection = source.Connect();
var time2 = DateTimeOffset.Now+TimeSpan.FromSeconds(2);
var valueAtTime2 = source.TakeWhile(ts=>ts.Timestamp <= time2)
.LastAsync();
valueAtTime2.Dump(); //LinqPad feature to output the result
この種のレトロスペクティブ クエリをサポートできる (できる?) システムは、CEP (Complex Event Processing) エンジンや EventStore スタイルのデータベースなどのシステムです。
[*1]。http://conal.net/papers/icfp97/icfp97.pdf