Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 从F中的序列可以观察到#_F#_Sequence_Observable - Fatal编程技术网

F# 从F中的序列可以观察到#

F# 从F中的序列可以观察到#,f#,sequence,observable,F#,Sequence,Observable,有没有办法从F#中的序列创建一个可观测的 所需的行为是,订阅生成的可观察对象的观察者一次一个地接收序列的所有值 编辑:问题可以被框定为:是否存在与F#中所示的Rx.Observable.FromArray([1,2,3])等价物 编辑2:谢谢大家。我花了一些时间才找到答案,结果发现desco已经回答了。为了完整起见,以下是它的工作原理: //Using the Reactive Framework. //References to System.CoreEx.dll and System.Rea

有没有办法从F#中的序列创建一个可观测的

所需的行为是,订阅生成的可观察对象的观察者一次一个地接收序列的所有值

编辑:问题可以被框定为:是否存在与F#中所示的
Rx.Observable.FromArray([1,2,3])
等价物

编辑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 ()

你可以试试被动扩展。请参考下面的博客,这可能会对你有很大帮助


位于System.Reactive.dll中,这是您想要的吗?

为了避免额外的依赖关系,使用F#events和我已经在中使用的
Observable.guard
函数实际上很容易实现该行为

以下是实施方案以及一个简单示例:

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")

我不太明白你所要求的行为。你是说一系列的可观测数据合并成一个<代码>折叠over
merge
maybe;)@达里奥:我的意思是我需要订阅序列的能力。例如,我会把一个列表转换成一个可观察的对象,它会触发连续的事件,每个事件都有一个列表成员。对于第一个.Net语言是F#的人来说,社区(和微软)让他们很难找到如何使用这些东西。你知道,要加载的程序集和要打开的模块应该比这简单一些。非常感谢。我其实希望能有这样的事情。
/// 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 }