2

私は 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# サンプルは最短の方法ですか、それとも別の方法がありますか?

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#型制約の例を参照していて、最後の例の 3 番目で、これを見つけました

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

^Tin の制約が で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>
于 2013-06-08T01:14:28.843 に答える