F# List.max<';T>;工作
从MSDN文档中,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就足够
List.max
的签名为:
List.max : 'T list -> 'T (requires comparison)
我的问题是:
- 编译器如何静态验证
是否支持比较操作'T
是否需要一个关键字来指定类型约束?如果是,我可以用它指定哪些类型的约束
- 我可以像在Scala中定义TypeClass那样定义自己的约束吗
,如
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