編集: Daniel と latkin が以下の回答とコメントで指摘したように、この質問には F# のバグが含まれており、2014 年初頭に修正されたようです。
Observable.StartWith のカリー化されたラッパーを作成しようとしています。プレリリースの Reactive Extensions 2.0 と VS11 ベータ版を使用しています。私の望む結果はstartWith : 'a -> IObservable<'a> -> IObservable<'a>
. 明らかな実装は次のようになります。
let startWith
(value : 'a)
(observable : IObservable<'a>)
: IObservable<'a> =
Observable.StartWith(observable, [| value |])
Observable.StartWith の意図したオーバーロードはStartWith<'TSource>(source : IObservable<'TSource>, params values: 'TSource[]) : IObservable<'TSource>
.
コンパイラは紛らわしいエラーをスローします: This method expects a CLI 'params' parameter in this position. 'params' is a way of passing a variable number of arguments to a method in languages such as C#. Consider passing an array for this argument
.
配列を渡しています。また、を省略して配列を渡さない[| |]
ようにしましたが、これは一意の過負荷解決の失敗につながります。(おそらく、他のオーバーロードと一致する可能性があるため'a
ですSystem.Reactive.Concurrency.IScheduler
。) F# 2.0/VS2010 も使用してみましたが、同じ結果が得られました。この種の状況やコンパイラ エラー メッセージに関するオンライン ディスカッションは見つかりませんでした。
これを実装する他の方法は考えられません。型パラメータが特定できる場合は問題ありません。たとえば、正常にlet prependZero : int -> IObservable<int> -> IObservable<int> = fun n o -> o.StartWith(n)
動作します。しかし、一般的なバージョンがいいでしょう。