3

MSDN ドキュメントからの署名List.maxは次のとおりです。

List.max : 'T list -> 'T (requires comparison)

私の質問は次のとおりです。

  • 'Tコンパイラは比較操作をサポートしていることをどのように静的に検証しますか?
  • requires型制約を指定するキーワードですか? はいの場合、どのタイプの制約を指定できますか?
  • Scala の型クラスでできるように、独自の種類の制約を定義できますか?
4

2 に答える 2

5

Don Symeのこのブログをご覧ください:F#での平等と比較の制約

これらの制約は、型クラスのライトの形式と考えることができ、通常はEquals / GetHashCodeをオーバーライドし、この場合に使用するにはIComparableを実装するだけで十分です。

あなたの質問に:

  1. はい、コンパイラはこれをチェックします
  2. はい、正確に言えば、詳細についてはF#仕様/ Docuをご覧ください
  3. 一種の-あなたはインターフェースなどに制約することができます-記事を参照してください

PS :(比較が必要)は、次<'a when 'a : comparison>のような一般的な定義のコンテキストで言うことによって定義されます

type MyType<'a when 'a : comparision>
于 2011-09-11T10:17:12.813 に答える
2

カルステンの答えはほとんどの基地をカバーしています。制約の宣言に関しては、比較演算子を使用することで推測されるため、ほとんどの場合、制約を宣言する必要はありません。例えば:

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
于 2011-09-11T15:35:28.300 に答える