cs-sdl を Rx に接続したいと思っていました。C# では動作するようになりましたが、F# ではかなり奇妙なことが起こり始めています。プログラミング時間を節約し、SDL イベントを引数として渡して IObservable にきちんとラップできるように、F# に固執したいと思います。これが私がそうしようとした方法です:
let fromEvent (e: IEvent<'H,'T>) = Observable.FromEventPattern<'H,'T>((fun h -> e.AddHandler(h)),(fun h -> e.RemoveHandler(h)))
これまでのところ、すべて順調です。ここで、SDL イベントの 1 つを渡して IObservable を取得します...
let MouseMotion = fromEvent(Events.MouseMotion)
などなど、この一連のモジュールが続きます。推論された型はすべて正しいです。MouseMotion はタイプですIObservable<MouseMotionEventArgs>
ここで、このライブラリをテスト用に作成した別のプロジェクトで実際に使用しています。
let observer : IObserver<MouseMotionEventArgs> = Observer.Create(Action<MouseMotionEventArgs>(fun x -> System.Console.WriteLine(x.X.ToString())))
ignore <| SdlDotNet.Reactive.CoreInput.MouseMotion.Subscribe(Observer.AsObserver(observer))
実行すると次のようになります。
System.ArgumentException was unhandled
Message="Type must derive from Delegate.\r\nParameter name: type"
Source="mscorlib"
ParamName="type"
StackTrace:
at System.Delegate.CreateDelegate(Type type, Object firstArgument, MethodInfo method, Boolean throwOnBindFailure)
at System.Delegate.CreateDelegate(Type type, Object firstArgument, MethodInfo method)
at System.Reactive.Linq.Observable.<>c__DisplayClass19d`2.<FromEvent>b__19b(IObserver`1 observer)
at System.Reactive.AnonymousObservable`1.<>c__DisplayClass1.<Subscribe>b__0()
at System.Reactive.Concurrency.Scheduler.Invoke(IScheduler scheduler, Action action)
at System.Reactive.Concurrency.ScheduledItem`2.InvokeCore()
at System.Reactive.Concurrency.ScheduledItem`1.Invoke()
at System.Reactive.Concurrency.CurrentThreadScheduler.Trampoline.Run()
at System.Reactive.Concurrency.CurrentThreadScheduler.Schedule[TState](TState state, TimeSpan dueTime, Func`3 action)
at System.Reactive.Concurrency.CurrentThreadScheduler.Schedule[TState](TState state, Func`3 action)
at System.Reactive.Concurrency.Scheduler.Schedule(IScheduler scheduler, Action action)
at System.Reactive.AnonymousObservable`1.Subscribe(IObserver`1 observer)
at <StartupCode$SdlDemo>.$Tutorial.main@() in C:\Users\Barend Venter\Documents\Visual Studio 2008\Projects\SdlDemo\SdlDemo\Tutorial.fs:line 77
InnerException:
私は完全に困惑しています。なぜこうなった?どこかで必要な eta 拡張はありますか?