是否有一个Haskell相当于Scala的Iterable.maxBy?

Chr*_*tin 10 haskell scala

Scala的IterablemaxBy:

找到产生功能最大值的第一个元素f.

def maxBy[B](f: (A) ? B)(implicit cmp: Ordering[B]): A
Run Code Online (Sandbox Code Playgroud)

例:

scala> Seq(-2, 1).maxBy(Math.abs)
res0: Int = -2

scala> Seq(-2, 3).maxBy(Math.abs)
res1: Int = 3
Run Code Online (Sandbox Code Playgroud)

什么是等效的Haskell方法呢?

Zet*_*eta 21

Scala Iterable与Haskell有关Traversable.然而,在这种情况下,Foldable就足以找到最大一个给定的集合,所以用maximumByData.Foldable结合compare `on` f(onData.Function)或comparing f(comparingData.Ord):

import Data.Foldable (maximumBy, Foldable)
import Data.Ord      (comparing)

maxBy :: (Foldable t, Ord a) => (b -> a) -> t b -> b
maxBy = maximumBy . comparing
Run Code Online (Sandbox Code Playgroud)


Chr*_*tin 7

使用 Data.List.maximumByData.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
Run Code Online (Sandbox Code Playgroud)