Вы пытались
minimumBy (comparing fst) xs
, который также может быть записан как
= head . sortBy (comparing fst) $ xs
= head . sortOn fst $ xs
= head . head . group . sortOn fst $ xs
= head . head . groupBy ((==) `on` fst) . sortOn fst $ xs
Это возвращает только первый элемент вместо их списка, поэтому просто отбросьте этот дополнительный head
чтобы получить то, что вы хотите:
= head . groupBy ((==) `on` fst) . sortOn fst $ xs
Конечно, иметь head
нехорошо, так как произойдет ошибка на входе []
. Вместо этого мы можем использовать опцию safe,
= concat . take 1 . groupBy ((==) `on` fst) . sortOn fst $ xs
. Кстати, любое решение, которое вызывает minimum
, также небезопасно для пустого списка ввода:
> head []
*** Exception: Prelude.head: empty list
> minimum []
*** Exception: Prelude.minimum: empty list
, но takeWhile
безопасно:
> takeWhile undefined []
[]
edit: , благодаря лени, общая временная сложность окончательной версии все равно должна быть O (n) даже в худшем случае.