Как работает List.max‹'T›?

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

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

Мои вопросы:

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

person missingfaktor    schedule 11.09.2011    source источник


Ответы (2)


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

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

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

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

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

type MyType<'a when 'a : comparision>
person Random Dev    schedule 11.09.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
person kvb    schedule 11.09.2011