【问题标题】: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 就足以在这种情况下使用它。
对于您的问题:
- 是的,编译器会检查这个
- 没错,查看 F# specifications / Docu 了解更多详情
- 一种 - 您可以限制接口之类的 - 请参阅文章
PS:(需要比较)是通过在通用定义的上下文中说<'a when 'a : comparison>来定义的
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