Return 函数的 return 值最高的列表元素

Return the element of a list at which the function's return value is the highest

我必须编写一个 Ord c => (a -> b) -> [a] -> a 函数,returns 第一个函数参数的值 returns 最高值。

例如:

ownMax (\x -> x `mod` 5) [7,8,9] == 9

ownMax length ["words", "are", "hard"] == "words"

到目前为止,我有以下代码,其中我尝试使用 maximumBy 函数,因为它可用于获得与我想要实现的目标相似的结果。

ownMax :: Ord c => (a -> b) -> [a] -> a
ownMax f (x:xs) = maximumBy((\a b -> compare (f a) (f b)) (x:xs))

目前,由于 Couldn't match type ‘Ordering’ with ‘a -> Ordering’ 错误,无法加载。

括号有问题。您为 maximumBy 打开两个括号,这意味着您应用 (x:xs) 作为您定义的 lambda 表达式的参数。您可以将 lambda 表达式定义为第一个参数,并将列表 xs 定义为第二个参数:

ownMax :: Ord b => (a -> b) -> [a] -> a
ownMax f <strong>xs</strong> = maximumBy <strong>(\a b -> compare (f a) (f b))</strong> xs

您还可以使用 on :: (b -> b -> c) -> (a -> b) -> a -> a -> c 对两个参数应用函数,因此:

import Data.Function(<strong>on</strong>)

ownMax :: (Foldable t, Ord b) => (a -> b) -> t a -> a
ownMax f = maximumBy (compare <strong>`on`</strong> f)

甚至更短:

import Data.Function(<strong>on</strong>)

ownMax :: (Foldable t, Ord b) => (a -> b) -> t a -> a
ownMax = maximumBy . <strong>on compare</strong>