2012-05-02 36 views
1

我使用一個API公開具有不同特性的數據:的「靜態」 /「歷史」 /流在F#數據統一模型

  • 「靜態」的參考數據,這是你問他們,得到一個值這理應不會改變
  • 「歷史」的價值觀,在這裏你可以查詢日期範圍
  • 「訂閱」值,你自己註冊接收更新

從一個語義點,壽呃,那些領域是一樣的,只有消費模式不同。參考數據可以看作是一個常數函數,通過時間產生相同的結果。歷史數據只是過去發生的數據流。

我試圖找到一個統一的模型,用它對我的查詢的所有語義進行編程,並將其與消費模式區分開來。

這意味着,可以以「實時」方式評估相同的引用,將字段轉換爲其適當的IObservable格式(如果可用),或以「歷史」方式將「時鐘」作爲參數並在打勾時產生數值或「參考」方式,它只產生1個值(仍然由查詢運行的歷史日期修飾)。

我不確定F#中的哪些編程工具是最適合這個目的的,但我想到的是我從未真正使用的引語。 它會非常適合這樣的任務嗎?

回答

0

你自己說的那樣:只是的IObservable去

  • 您的靜態情況下只是OnNext 1個值
  • 在歷史的情況下,你OnNext在您的查詢中的每個值(一次當一個觀察者註冊)
  • 和訂閱案例只是普通的IObservable模式 - 你不需要像引用這樣的東西。
+0

因此,所有這些領域將是類型:ICLOCK - >的IObservable <'T>? – nicolas

+0

是的,爲什麼不行 - 但我不認爲你真的需要IClock的東西,如果你使它成爲'IObservable '或者如果你有某種方法從'T'中提取時間 - 如果你需要精細的IClock-蜱可以分開 – Carsten

+0

我可能需要獨立的時鐘,因爲許多字段將會是儘可能多的數據源,如果我想回放,則需要某種形式的同步。我想象得必須經歷一個代表時間的公共共享狀態變量 – nicolas

0

我已經做了非常相似的(不是靜態情況下,但流和歷史的情況下)的東西,並且IObservable絕對是這份工作的合適工具。在現實中,IEnumerableIObservable是雙重的,也是大多數情況下你可以爲另一個寫的。但是,基於推送的模型(IObservable)更加靈活,您作爲Rx的一部分獲得的操作符比常規的IEnumerable LINQ的部分更加完整和適當。

使用引號就意味着您需要從頭開始構建上述代碼。

你會發現下面的有用:

  • Observable.Return(value)單個靜態值
  • list.ToObservable()用於車削歷史枚舉到可觀察
  • 直接IObservable爲流值到的IObservable

另外請注意,如果這有助於您可以使用虛擬調度器來勾選observable(大多數ab ove接受調度程序)。我想這是你想要的歷史案例。

http://channel9.msdn.com/Series/Rx-Workshop/Rx-Workshop-Schedulers