List.max<'T>如何?工作?

时间:2011-09-11 10:01:45

标签: f# type-constraints parametric-polymorphism

从MSDN文档中,List.max的签名是:

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

我的问题是:

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

2 个答案:

答案 0 :(得分:5)

看看Don Syme的这篇博客:Equality and Comparison Constraints in F#

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

问题:

  1. 是的,编译器会检查这个
  2. 是的,请查看F#specifications / Docu了解更多详情
  3. 有点 - 你可以禁用界面,也就是说 - 看文章
  4. PS:(需要比较)的定义是在通用定义的上下文中说<'a when 'a : comparison>,如

    type MyType<'a when 'a : comparision>
    

答案 1 :(得分:2)

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

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