F# 如何在Rx中进行模式匹配。在单个运算符中的何处选择?
假设我有这种类型:F# 如何在Rx中进行模式匹配。在单个运算符中的何处选择?,f#,pattern-matching,system.reactive,F#,Pattern Matching,System.reactive,假设我有这种类型: type T = int option 以及该类型的可观察物: let o : IObservable<T> = // create the observable 仅传播某些情况的可观察对象 有几件事我不喜欢 我用了两个操作符 我做了两次模式匹配 第二种模式匹配并不详尽(使VisualStudio显示警告并感到奇怪) 太多的代码。每次我需要模式匹配时,模式都会重复 多亏了@Lee,我想出了一个很好的解决方案 o.SelectMany(function | N
type T = int option
以及该类型的可观察物:
let o : IObservable<T> = // create the observable
仅传播某些
情况的可观察对象
有几件事我不喜欢
- 我用了两个操作符
- 我做了两次模式匹配
- 第二种模式匹配并不详尽(使VisualStudio显示警告并感到奇怪)
- 太多的代码。每次我需要模式匹配时,模式都会重复
- 多亏了@Lee,我想出了一个很好的解决方案
o.SelectMany(function | None -> Observable.Empty() | Some t -> Observable.Return t)
这适用于任何联合类型,而不是唯一的选项。您不能使用吗?大概是这样的:
let o1 : IObservable<int option> = // ...
let o2 = Observable.choose id o1
然后你可以做:
let o1 : IObservable<TwoSubcases<int, float>> = // ...
let o2 : IObservable<float> = Observable.choose (|SecondCase|_|) o1
让o1:IObservable=/。。。
让o2:IObservable=Observable.choose(| SecondCase | | | |)o1
您应该能够使用SelectMany
:o.SelectMany(趣味t->t |>Option.toArray:>int-seq)
听起来好像缺少choose
功能。该项目可能需要拉取请求:)听起来不错:)您可能希望在此处发布一个指向您的PR的链接,以便将来的访问者可以调查其状态。是的,您是对的。我怎么会错过它。。。对于其他联合类型,可以使用部分活动模式而不是id
。
type TwoSubcases<'a,'b> = | Case1 of 'a | Case2 of 'b
let (|SecondCase|_|) = function
| Case1 _ -> None
| Case2 b -> Some b
let o1 : IObservable<TwoSubcases<int, float>> = // ...
let o2 : IObservable<float> = Observable.choose (|SecondCase|_|) o1