统一F#中'静态'/'历史'/流数据的模型

时间:2012-05-02 12:28:54

标签: f# metaprogramming quotations

我使用的API公开具有不同特征的数据:

  • '静态'参考数据,即您要求它们,获得一个据称不会改变的值
  • '历史'值,您可以在其中查询日期范围
  • '订阅'值,您自己注册接收更新

从语义的角度来看,这些字段是同一个,只有消费模式不同。参考数据可视为常数函数,随时间产生相同的结果。历史数据只是过去发生的流数据。

我正在尝试找到一个统一的模型来对我的查询的所有语义进行编程,并将其与其消费模式区分开来。

这意味着,相同的报价可以以“实时”的方式进行评估,这种方式可以将字段转换为适当的IObservable形式(如果可用),或者以“历史”方式,将“时钟”作为参数并且勾选时的产量值,或“引用”方式,它只产生1个值(仍由查询运行的历史日期装饰..)

我不确定F#中哪些编程工具最适合这个目的,但我想的是引用,我从来没有真正使用过。 它是否适合完成这项任务?

2 个答案:

答案 0 :(得分:0)

你自己说:只需使用IObservable

  • 你的静态案例只是OnNext,有1个值
  • 在您的历史案例中,查询中的每个值都是OnNext(注册观察者时立即)
  • 并且订阅案例只是普通的IObservable模式 - 你不需要像这样的引用。

答案 1 :(得分:0)

我做了一些非常相似的事情(不是静态情况,而是流媒体和历史案例),IObservable绝对是工作的正确工具。实际上,IEnumerableIObservable是双重的,大多数事情你可以写一个,你也可以为另一个写。但是,基于推送的模型(IObservable)更灵活,作为Rx的一部分获得的运算符比作为常规IEnumerable LINQ的一部分的运算符更完整和合适。

使用引文意味着您需要从头开始构建上述内容。

您会发现以下内容有用:

  • Observable.Return(value)表示单个静态值
  • list.ToObservable()用于将历史可枚举变为可观察的
  • 直接IObservable以便将值流式传输到IObservable

另请注意,如果这有帮助,您可以使用虚拟调度程序勾选observable(上述大多数接受调度程序)。我想这就是你想要的历史案例。

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