Как работает List.max <'T>? - PullRequest
       59

Как работает List.max <'T>?

3 голосов
/ 11 сентября 2011

Из документов MSDN подпись List.max:

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

Мои вопросы:

  • Как компилятор статически проверяет, что 'T поддерживает операцию сравнения?
  • Является ли requires ключевым словом для определения ограничений типа? Если да, какие все типы ограничений я могу указать с ним?
  • Могу ли я определить свои собственные виды ограничений, как я могу это сделать с классами типов в Scala?

Ответы [ 2 ]

5 голосов
/ 11 сентября 2011

посмотрите на этот блог от Дона Сайма: Ограничения равенства и сравнения в F #

вы можете думать об этих ограничениях как о форме света классов типов, обычно переопределяя Equals / GetHashCode, и реализации IComparable достаточно для его использования в этих случаях.

На ваши вопросы:

  1. да, компилятор проверит это
  2. Да, точно, посмотрите спецификации F # / Docu для получения более подробной информации
  3. вид - можно противоречить интерфейсам и тому подобное - см. Статьи

PS: (требуется сравнение) определяется, говоря <'a when 'a : comparison> в контексте общего определения, такого как

type MyType<'a when 'a : comparision>
2 голосов
/ 11 сентября 2011

Ответ Карстена охватывает большинство основ.Что касается объявления ограничения, в большинстве случаев вам не нужно объявлять его, так как оно будет выведено при любом использовании оператора сравнения.Например:

let myListMax l = l |> List.reduce (fun x y -> if x > y then x else y)
// or myListMax l = l |> List.reduce max

Как сказал Карстен, если вы хотите явно аннотировать определение с помощью ограничения, вы можете сделать это следующим образом:

let myListMax (l:'a list) : 'a when 'a : comparison = l |> List.reduce max
...