我正在使用 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)
这只是偏好吗?有没有理由选择一种方式而不是另一种方式?
最佳答案
当决定之间
(scheduler: 'a option when 'a :> IScheduler)
-or-
(scheduler: 'a when 'a :> IScheduler option)
,
编译器会告诉你第一个变体解析为
(scheduler: #IScheduler option)
而第二个应该生成一个警告,它已被限制为
(scheduler: IScheduler option)
.因此,您的第一个变体实际上是您想要它做的。
#
符号称为 flexible type .
关于generics - 在 F# 中,两种泛型类型约束表示有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53754840/