【问题标题】:How does List.max<'T> work?List.max<'T> 是如何工作的?
【发布时间】:2011-09-11 10:01:44
【问题描述】:

来自 MSDN 文档,List.max 的签名是:

List.max : 'T list -> 'T (requires comparison)

我的问题是:

  • 编译器如何静态验证'T是否支持比较操作?
  • requires 是指定类型约束的关键字吗?如果是,我可以用它指定哪些所有类型的约束?
  • 我可以像在 Scala 中使用类型类那样定义自己的约束类型吗?

【问题讨论】:

    标签: f# type-constraints parametric-polymorphism


    【解决方案1】:

    看看这个来自 Don Syme 的博客:Equality and Comparison Constraints in F#

    您可以将这些约束视为一种轻型的类型类形式,通常覆盖 Equals/GetHashCode 并实现 IComparable 就足以在这种情况下使用它。

    对于您的问题:

    1. 是的,编译器会检查这个
    2. 没错,查看 F# specifications / Docu 了解更多详情
    3. 一种 - 您可以限制接口之类的 - 请参阅文章

    PS:(需要比较)是通过在通用定义的上下文中说&lt;'a when 'a : comparison&gt;来定义的

    type MyType<'a when 'a : comparision>
    

    【讨论】:

      【解决方案2】:

      卡斯滕的回答涵盖了大部分基础。关于声明约束,在大多数情况下,您不需要声明它,因为它将通过任何比较运算符的使用来推断。例如:

      let myListMax l = l |> List.reduce (fun x y -> if x > y then x else y)
      // or myListMax l = l |> List.reduce max
      

      正如 Carsten 所说,如果你想用约束明确地注释定义,你可以这样做:

      let myListMax (l:'a list) : 'a when 'a : comparison = l |> List.reduce max
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多