سؤال

هل هناك طريقة لإنشاء تسلسل في تسلسل في F#؟

السلوك المطلوب هو أن المراقب الذي يشترك في الملاحظة الناتجة يتلقى جميع قيم التسلسل في وقت واحد.

تعديل: يمكن تأطير السؤال على النحو التالي: هل هناك ما يعادل Rx.Observable.FromArray([1,2,3]) كما هو موضح هنا في F#؟

تحرير 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.linq.Observable.ToObservable (هذا المصدر غير المصاب) يقع في System.Reactive.dll الشيء الذي تريده؟

نصائح أخرى

فقط في حال كنت ترغب في تجنب التبعية الإضافية ، من السهل جدًا تنفيذ السلوك باستخدام أحداث F# و Observable.guard الوظيفة التي استخدمتها بالفعل في إجابة أخرى هنا في Stackoverflow.

هنا هو التنفيذ مع مثال موجز:

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

وللتكمل ، تنفيذ Observable.guard يشبه هذا:

/// 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 } 

يمكنك تجربة الامتدادات التفاعلية. يرجى الرجوع إلى إدخال المدونة التالي والذي قد يساعدك كثيرًا.

http://www.navision-blog.de/2009/10/20/iobservableiobserver-using-the-reactive-framework-with-f/

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top