Как работает List.max<'T>?
Из документов MSDN, подпись List.max
является:
List.max : 'T list -> 'T (requires comparison)
Мои вопросы:
- Как компилятор статически проверяет, что
'T
поддерживает операцию сравнения? - Является
requires
ключевое слово для указания ограничений типа? Если да, какие все типы ограничений я могу указать с ним? - Могу ли я определить свои собственные виды ограничений, как я могу сделать с классами типов в Scala?
2 ответа
Взгляните на этот блог от Дона Сайма: ограничения равенства и сравнения в F#
Вы можете думать об этих ограничениях как о форме легких классов, обычно переопределяющих Equals/GetHashCode, и реализации IComparable достаточно для его использования в этих случаях.
На ваши вопросы:
- да, компилятор проверит это
- да, именно, посмотрите спецификации F / Документация для получения более подробной информации
- вроде - можно противоречить интерфейсам и тому подобное - смотреть статьи
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