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

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

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

Мои вопросы:

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

2 ответа

Решение

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

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

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

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

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

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

let myListMax (l:'a list) : 'a when 'a : comparison = l |> List.reduce max
Другие вопросы по тегам