我正在使用Rx进行计划项目。其中一种方法如下:
let strike (scheduler: 'a when 'a :> IScheduler option) strikeTime source =
match strikeTime with
| StrikeOnceAt due -> strikeOnce scheduler (Choice1Of2 due) source
| StrikeOnceAfter delay -> strikeOnce scheduler (Choice2Of2 delay) source
| StrikeEvery (period, last) -> strikeEvery scheduler period last source
测试时,我使用的是HistoricalScheduler
,它当然是从IScheduler
派生的。
let ``Repeater strikes at given rate per minute`` rpm =
let sched = new HistoricalScheduler(DateTimeOffset.Now)
let rate = rpm |> int64 |> Min |> toRate
let repeat = Repeater.StrikeEvery (rate, None)
use actual = Repeater.strike (Some sched) repeat source
我希望不使用调用代码中的sched :> IScheduler
,而希望使用上面显示的类型约束。
我不确定是否将约束表示为...
(scheduler: 'a option when 'a :> IScheduler)
-或者-
(scheduler: 'a when 'a :> IScheduler option)
这只是偏爱吗?有理由选择一种方法而不是另一种方法吗?
答案 0 :(得分:4)
决定之间
(scheduler: 'a option when 'a :> IScheduler)
-或-
(scheduler: 'a when 'a :> IScheduler option)
,
编译器会告诉您第一个变体解析为
(scheduler: #IScheduler option)
而第二个应该生成警告,表明它已被限制为
(scheduler: IScheduler option)
。
因此,您的第一个变体实际上完成了您想要的工作。 #
表示法称为flexible type。