Нет, такой встроенной функции нет. Вот наивная реализация для вас:
let mode = function
| [] -> None
| xs ->
let mostFrequentTwo =
xs
|> Seq.groupBy id
|> Seq.map (fun (n, ns) -> n, Seq.length ns)
|> Seq.sortByDescending snd
|> Seq.truncate 2
|> Seq.toList
match mostFrequentTwo with
| [(x, xSize); (_, ySize)] when xSize > ySize -> Some x
| [(x, _)] -> Some x
| _ -> None
Сначала он группирует числа в списке, затем берет размер каждой группы, затем сортирует группы по размеру в порядке убывания, а затем выбирает первые два. Если есть две группы, а первая больше, то это режим; если есть только одна группа, то это режим; в противном случае нет режима.
Я называю эту реализацию "наивной", потому что она делает некоторые вещи, которые строго говоря ненужны: лучшим подходом было бы сначала отсортировать числа, а затем просмотреть их настолько, чтобы увидеть первые две группы и сравнить их размеры. , Однако, это было бы сложнее написать и труднее понять, но вычислительная сложность вышеупомянутого решения все еще n * log n
(или даже линейная, в зависимости от реализаций группировки и сортировки), поэтому нет необходимости оптимизировать до просмотра данных о производительности.