在F#中,两个通用类型约束表示形式之间的区别是什么

时间:2018-12-13 04:01:15

标签: generics f# type-constraints

我正在使用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)

这只是偏爱吗?有理由选择一种方法而不是另一种方法吗?

1 个答案:

答案 0 :(得分:4)

决定之间

  

(scheduler: 'a option when 'a :> IScheduler)-或-

     

(scheduler: 'a when 'a :> IScheduler option)

编译器会告诉您第一个变体解析为

(scheduler: #IScheduler option)

而第二个应该生成警告,表明它已被限制为

(scheduler: IScheduler option)

因此,您的第一个变体实际上完成了您想要的工作。 #表示法称为flexible type

相关问题