Есть ли эквивалент 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