2012-06-17 2 views
3

Там хорошая F # рабочий строитель для Rx здесь:F # рабочий строитель для Rx

http://blogs.msdn.com/b/dsyme/archive/2011/05/30/nice-f-syntax-for-rx-reactive-extensions.aspx

Я пытался сделать с помощью реализации для рабочего процесса, но держать стучать головой о стену. Может быть, здесь слишком поздно.

Как создать это?

type RxBuilder() = 

    // ... 

    member this.Using (disposable, f) = 
     Observable.Using(???) 

Заранее благодарен.

ответ

4

Во-первых, исходный код необходимо немного обновить для последних выпусков Rx. А именно, For и While должны быть реализованы как:

member this.For (xs : 'a seq, f: 'a -> 'b IObservable) = 
    Observable.SelectMany(xs.ToObservable(), new Func<_, IObservable<_>>(f)) 

member this.While (f, xs: 'a IObservable) = 
    Observable.TakeWhile (xs, new Func<_,bool>(fun _ -> f())) 

Затем, на основе this, вы можете использовать следующие для реализации Using:

member this.Using(res:#IDisposable, body) = this.TryFinally(body res, fun() -> match res with null ->() | disp -> disp.Dispose()) 
+0

Ницца! Мне нравится обозначение ограничения. Похоже, нужно взглянуть на fsharpx поближе. –

+0

Моя реализация For фактически выглядела так: member this.For (xs: 'a IObservable, f:' a -> 'b IObservable):' b IObservable = xs.SelectMany (f). Еще не проверено. –

+0

Это в основном то же самое, я просто не использовал формат метода расширения по причинам стиля (в соответствии с другими реализациями) и явные аргументы типа, чтобы подтвердить, что все работает так, как ожидалось. – yamen

 Смежные вопросы

  • Нет связанных вопросов^_^