Есть ли эквивалент Haskell для Scala Iterable.maxBy?
Scala Iterable имеет maxBy
:
Находит первый элемент, который дает наибольшее значение, измеряемое функцией f
.
def maxBy[B](f: (A) ⇒ B)(implicit cmp: Ordering[B]): A
Пример:
scala> Seq(-2, 1).maxBy(Math.abs)
res0: Int = -2
scala> Seq(-2, 3).maxBy(Math.abs)
res1: Int = 3
Какой эквивалентный способ Haskell для этого?
Ответы
Ответ 1
Scala Iterable
связан с Haskell Traversable
. Однако в этом случае Foldable
достаточно, чтобы найти максимум данного набора, поэтому используйте maximumBy
из Data.Foldable
в сочетании с compare `on` f
(on
от Data.Function
) или comparing f
(comparing
от Data.Ord
):
import Data.Foldable (maximumBy, Foldable)
import Data.Ord (comparing)
maxBy :: (Foldable t, Ord a) => (b -> a) -> t b -> b
maxBy = maximumBy . comparing
Ответ 2
Использование
Data.List.maximumBy
а также
Data.Ord.comparing
.
comparing :: Ord a => (b -> a) -> b -> b -> Ordering
maximumBy :: (a -> a -> Ordering) -> [a] -> a
Пример:
> import Data.Ord (comparing)
> import Data.List (maximumBy)
> maximumBy (comparing abs) [-2, 1]
-2
> maximumBy (comparing abs) [-2, 3]
3