В F #, в чем разница между двумя представлениями ограничения универсального типа - PullRequest
0 голосов
/ 13 декабря 2018

Я использую 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 голосов
/ 13 декабря 2018

При выборе между

(scheduler: 'a option when 'a :> IScheduler) -или-

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

компилятор скажет вам, что первый вариант разрешаетсякак

(scheduler: #IScheduler option)

, в то время как второе должно генерировать предупреждение о том, что оно ограничено

(scheduler: IScheduler option).

Поэтому ваш первый вариант делаетна самом деле, что вы хотите это сделать.Обозначение # называется гибким типом .

...