F# List.max<';T>;工作

F# List.max<';T>;工作,f#,type-constraints,parametric-polymorphism,F#,Type Constraints,Parametric Polymorphism,从MSDN文档中,List.max的签名为: List.max : 'T list -> 'T (requires comparison) 我的问题是: 编译器如何静态验证'T是否支持比较操作 是否需要一个关键字来指定类型约束?如果是,我可以用它指定哪些类型的约束 我可以像在Scala中定义TypeClass那样定义自己的约束吗 看看Don Syme的博客: 您可以将这些约束视为类型类的一种形式,通常覆盖Equals/GetHashCode,在这种情况下实现IComparable就足够

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

List.max : 'T list -> 'T (requires comparison)
我的问题是:

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

看看Don Syme的博客:

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

关于你的问题:

  • 是的,编译器将对此进行检查
  • 是的,没错,请查看F#/了解更多详细信息
  • 有点-你可以限制接口之类的-参见文章
  • PS:the(requires comparison)(需要比较)的定义是在一般定义的上下文中说
    ,如

    type MyType<'a when 'a : comparision>
    
    type MyType
    
    卡斯滕的回答涵盖了大部分基础。关于声明约束,在大多数情况下,您不需要声明它,因为它将通过使用比较运算符进行推断。例如:

    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