C# 如何打开可观察的<;IObservable<;T>&燃气轮机;变成一个可观察的<;T>;?

C# 如何打开可观察的<;IObservable<;T>&燃气轮机;变成一个可观察的<;T>;?,c#,.net,f#,observable,reactive-programming,C#,.net,F#,Observable,Reactive Programming,假设我有一个函数返回IObservable,这个函数需要初始状态 let myObservable (initialState: T) :IObservable<T> = (...) 当前resultObservable是IObservable,但我希望它是IObservable,并在初始状态就绪后从myObservable发出值。您可以使用 一般来说,如果您使用提升的类型A,将其降低到T,从T->U投影它,并将其提升到A,则该操作称为bind Observable.bind (f

假设我有一个函数返回
IObservable
,这个函数需要初始状态

let myObservable (initialState: T) :IObservable<T> = (...)
当前resultObservable是
IObservable
,但我希望它是
IObservable
,并在初始状态就绪后从myObservable发出值。

您可以使用


一般来说,如果您使用提升的类型
A
,将其降低到
T
,从
T->U
投影它,并将其提升到
A
,则该操作称为
bind

Observable.bind (fun init -> myObservable init) initializeObservable
或者简化:

initializeObservable |> Observable.bind myObservable

至于你的方法,你差不多做到了

initializeObservable 
|> Observable.map (fun initialState -> myObservable initialState)
|> Observable.mergeInner

即使您的
初始化Observable
发出n次,您也可以将所有观察值合并在一起,即使它只发出一次,这同样有效。

只需将Observable.map替换为Observable.bind并跳过mergeInner即可,否?或者只是初始化Observable |>Observable.bind MyObservable当然可以。但是,如果您必须使用更高阶的可观测值,您可以根据您的用例使用
collect
merge
switch
Observable.bind (fun init -> myObservable init) initializeObservable
initializeObservable |> Observable.bind myObservable
initializeObservable 
|> Observable.map (fun initialState -> myObservable initialState)
|> Observable.mergeInner