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>
我必须编写一个 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>