编辑:请注意,正如 Daniel 和 latkin 在下面的答案和评论中指出的那样,这个问题涉及 F# 中的一个错误,该错误似乎已在 2014 年初修复。
我正在尝试为 Observable.StartWith 编写一个咖喱包装器。我正在使用预发布的 Reactive Extensions 2.0 和 VS11 beta。我想要的结果是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)
工作正常。但是通用版本会很好。