f# - 可从 F# 中的序列观察

标签 f# sequence observable

有没有办法从 F# 中的序列创建一个 observable?

所需的行为是订阅结果 observable 的观察者一次接收序列的所有值。

编辑 : 问题可以表述为: 是否有等价于 Rx.Observable.FromArray([1,2,3])如图 here在 F# 中?

编辑 2 : 谢谢大家。我花了一些时间才找到答案,才发现desco已经回答了。为了完整起见,这里是它的工作原理:

//Using the Reactive Framework.
//References to System.CoreEx.dll and System.Reactive.dll are needed.

open System.Linq

let observable = Observable.ToObservable [1..10]
let odds = observable |> Observable.filter (fun i -> i%2=1)
let disp = odds.Subscribe (fun i -> printfn "%d" i)
disp.Dispose ()

最佳答案

以防万一您想避免额外的依赖项,实际上使用 F# 事件和 Observable.guard 实现该行为非常容易。我已经在 another answer here at StackOverflow 中使用的功能.

下面是一个简单的例子的实现:

module Observable = 
  let ofSeq s = 
    let evt = new Event<_>()
    evt.Publish |> Observable.guard (fun o ->
      for n in s do evt.Trigger(n))

[ 1 .. 10 ] |> Observable.ofSeq
            |> Observable.filter (fun n -> n%2 = 0)
            |> Observable.add (printfn "%d")

并且为了完整性,实现 Observable.guard看起来像这样:
/// Creates an observable that calls the specified function after someone
/// subscribes to it (useful for waiting using 'let!' when we need to start
/// operation after 'let!' attaches handler)
let guard f (e:IObservable<'Args>) =  
  { new IObservable<'Args> with  
      member x.Subscribe(observer) =  
        let rm = e.Subscribe(observer) in f(); rm } 

关于f# - 可从 F# 中的序列观察,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3845110/

相关文章:

Angular 2/RXJS - 需要一些帮助来处理请求

random - 这是一个适当的线程安全随机包装器吗?

excel - 接口(interface)和扩展ApplicationClass

angular - 在重试 Observable 之前更改 HTTP header

python - 验证算术序列python

SQL:如何在一个查询中编写多个交互式脚本(插入行)

arrays - 数组到数组的 Observable(Rxjs)

f# - 为什么 'let x = 1' 是有效的 F# 表达式?

f# - fslex 中的 Lua 长字符串

javascript - 最后在 rxjs 上序列在第一个错误时执行