MSDN ドキュメントからの署名List.max
は次のとおりです。
List.max : 'T list -> 'T (requires comparison)
私の質問は次のとおりです。
'T
コンパイラは比較操作をサポートしていることをどのように静的に検証しますか?requires
型制約を指定するキーワードですか? はいの場合、どのタイプの制約を指定できますか?- Scala の型クラスでできるように、独自の種類の制約を定義できますか?
MSDN ドキュメントからの署名List.max
は次のとおりです。
List.max : 'T list -> 'T (requires comparison)
私の質問は次のとおりです。
'T
コンパイラは比較操作をサポートしていることをどのように静的に検証しますか?requires
型制約を指定するキーワードですか? はいの場合、どのタイプの制約を指定できますか?Don Symeのこのブログをご覧ください:F#での平等と比較の制約
これらの制約は、型クラスのライトの形式と考えることができ、通常はEquals / GetHashCodeをオーバーライドし、この場合に使用するにはIComparableを実装するだけで十分です。
あなたの質問に:
PS :(比較が必要)は、次<'a when 'a : comparison>
のような一般的な定義のコンテキストで言うことによって定義されます
type MyType<'a when 'a : comparision>
カルステンの答えはほとんどの基地をカバーしています。制約の宣言に関しては、比較演算子を使用することで推測されるため、ほとんどの場合、制約を宣言する必要はありません。例えば:
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