我正在练习使用F#而我正在为F#实现一个类型约束的比较函数。在C#中,它是由
实现的// in C#
static int cmp<T>(T x, T y) where T: System.IComparable<T>
{
return x.CompareTo(y);
}
然而,在F#中,我提出的最佳方式就是这个。
(* in F# *)
let cmp (x: 'a when 'a :> 'a System.IComparable) (y: 'a when 'a :> 'a System.IComparable)
= x.CompareTo(y)
我尝试了下面的那个,但它不起作用
let cmp (x: 'a) (y: 'a) when 'a :> 'a System.IComparable
= x.CompareTo(y)
我的F#样本是最短的还是另一种?
答案 0 :(得分:4)
另一种(更清洁,IMO)实现方法是通过向函数添加显式泛型类型参数,如下所示:
let cmp<'T when 'T :> System.IComparable<'T>> (x : 'T) (y : 'T) =
x.CompareTo y
答案 1 :(得分:2)
好的,找到了。我正在浏览MSDN的F#type constraint中的示例,在上一个示例的第三个示例中,我发现了这个
let inline add(value1 : ^T when ^T : (static member (+) : ^T * ^T -> ^T), value2: ^T) =
value1 + value2
我注意到^T
中value1
中的value2
约束已在cmp
中使用,因此我将let cmp (x: 'a when 'a :> 'a System.IComparable) (y: 'a) = x.CompareTo(y)
函数更改为此
fsi
我浏览了> let cmp (x: 'a when 'a :> 'a System.IComparable) (y: 'a) = x.CompareTo(y);;
val cmp : 'a -> 'a -> int when 'a :> System.IComparable<'a>
> let cmp (x: 'a when 'a :> 'a System.IComparable) (y: 'a when 'a :> 'a System.IComparable) = x.CompareTo(y);;
val cmp : 'a -> 'a -> int when 'a :> System.IComparable<'a>
并获得了相同类型的签名
{{1}}