从MSDN文档中,List.max
的签名是:
List.max : 'T list -> 'T (requires comparison)
我的问题是:
'T
是否支持比较操作?requires
是指定类型约束的关键字吗?如果是,我可以用它指定所有类型的约束吗?答案 0 :(得分:5)
看看Don Syme的这篇博客:Equality and Comparison Constraints in F#
您可以将这些约束视为类型类轻量级的形式,正则覆盖Equals / GetHashCode并且在这种情况下实现IComparable足以使用它。
问题:
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