2

我正在使用 F# 进行练习,并且我已经为 F# 实现了类型约束的比较函数。在 C# 中,它是由 this 实现的

// 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# 样本是最短的方式还是有另一种方式?

4

2 回答 2

4

另一种(更清洁,IMO)实现这一点的方法是向函数添加显式泛型类型参数,如下所示:

let cmp<'T when 'T :> System.IComparable<'T>> (x : 'T) (y : 'T) =
    x.CompareTo y
于 2013-06-08T01:48:22.930 回答
2

好的,找到了。我正在浏览 MSDN 的 F#类型约束中的示例,在最后一个示例的第三个中,我发现了这个

let inline add(value1 : ^T when ^T : (static member (+) : ^T * ^T -> ^T), value2: ^T) =
    value1 + value2

我注意到 in 的约束被用于 in ^T,所以我将我的函数更改为这个value1value2cmp

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>
于 2013-06-08T01:14:28.843 回答