F#的较短类型约束

时间:2013-06-08 01:02:19

标签: f# type-constraints

我正在练习使用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#样本是最短的还是另一种?

2 个答案:

答案 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

我注意到^Tvalue1中的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}}