2015-05-27 13 views
6

Giả sử tôi có loại này:Cách thực hiện đối sánh mẫu trong Rx. Ở đâu và chọn trong một toán tử?

type T = int option 

và quan sát của loại hình đó:

let o : IObservable<T> = // create the observable 

Tôi đang tìm kiếm một cách tốt hơn để bày tỏ điều này:

o.Where(function | None -> false | Some t -> true) 
.Select(function | Some t -> t) 

Có thể quan sát được rằng chỉ tuyên truyền trường hợp Some.

Có một số điều tôi không thích.

  • Tôi sử dụng 2 nhà khai thác
  • Tôi mô hình phù hợp với hai lần
  • Các mô hình kết hợp thứ hai là không đầy đủ (làm cho visual studio hiển thị một cảnh báo và cảm thấy lẻ)
  • Quá nhiều mã. Mẫu lặp lại mỗi lần tôi cần khớp mẫu.
+2

Bạn sẽ có thể sử dụng 'SelectMany':' o.SelectMany (fun t -> t |> Option.toArray:> int seq) ' – Lee

+2

Âm thanh như [FSharp.Control.Reactive] (http://fsprojects.github.io/FSharp.Control.Reactive) thiếu chức năng' select'. Dự án có thể yêu cầu kéo :) –

+0

Âm thanh tốt :) Bạn có thể muốn đăng liên kết tới PR của mình tại đây, để khách truy cập trong tương lai có thể điều tra trạng thái của nó. –

Trả lời

4

Bạn không thể sử dụng Observable.choose? một cái gì đó như thế này:

let o1 : IObservable<int option> = // ... 
let o2 = Observable.choose id o1 

Nếu bạn có một loại đó không phải là một lựa chọn, nói:

type TwoSubcases<'a,'b> = | Case1 of 'a | Case2 of 'b 

và một mô hình hoạt động một phần:

let (|SecondCase|_|) = function 
    | Case1 _ -> None 
    | Case2 b -> Some b 

sau đó bạn có thể làm:

let o1 : IObservable<TwoSubcases<int, float>> = // ... 
let o2 : IObservable<float> = Observable.choose (|SecondCase|_|) o1 
+0

Vâng, bạn nói đúng. Làm thế nào tôi đã bỏ lỡ nó ... Và đối với các loại công đoàn khác, bạn có thể sử dụng một mẫu hoạt động từng phần thay vì 'id'. –

4

Nhờ @Lee tôi đã đưa ra một giải pháp tốt đẹp.

o.SelectMany(function | None -> Observable.Empty() | Some t -> Observable.Return t) 

Điều này phù hợp với mọi loại công đoàn, không chỉ Tùy chọn.

Các vấn đề liên quan