generics - 在 F# 中,两种泛型类型约束表示有什么区别

标签 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)
这只是偏好吗?有没有理由选择一种方式而不是另一种方式?

最佳答案

当决定之间

(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/

相关文章:

f# - 使用更新的片段定义大型不可变类型的正确方法?

haskell - 使用约束类型写入 GADT 记录

c++全局运算符不能很好地与模板类一起使用

generics - 使用 GHC.Generics 或 Data.Data 类型族

c - C99 如何在没有 _Generic (C11) 的情况下键入泛型宏?

java - 数组列表中的泛型错误

f# - 在 Owin 应用程序中安装 Suave

f# - 在 f# 中以字符串的形式调用函数

.net - .net 中泛型类型的属性约束?

c# - 一个特殊的 "convertability from int"可以作为 C# 中的类型约束吗?