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

mis*_*tor 3 f# type-constraints parametric-polymorphism

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

List.max : 'T list -> 'T (requires comparison)
Run Code Online (Sandbox Code Playgroud)

我的问题是:

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

Car*_*ten 5

看看Don Syme的博客:F#中的平等和比较约束

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

对你的问题:

  1. 是的,编译器会检查这个
  2. 确切地说,请查看F#规格/Docu以获取更多详细信息
  3. 有点 - 你可以禁止接口和那样 - 看文章

PS:(需要比较)是通过<'a when 'a : comparison>在通用定义的上下文中定义来定义的

type MyType<'a when 'a : comparision>
Run Code Online (Sandbox Code Playgroud)