我必須撰寫一個Ord c => (a -> b) -> [a] -> a函式,該函式回傳第一個函式引數回傳最高值時的值。
例如:
ownMax (\x -> x `mod` 5) [7,8,9] == 9
ownMax 長度 ["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’錯誤而無法加載。
uj5u.com熱心網友回復:
括號有問題。您為 the 打開兩個括號maximumBy,這意味著您將其(x:xs)作為引數應用于您定義的 lambda 運算式。您可以將 lambda 運算式定義為第一個引數,將串列定義xs為第二個引數:
ownMax :: Ord b => (a -> b) -> [a] -> a
ownMax f xs = maximumBy (\a b -> compare (f a) (f b)) xs
您還可以使用on :: (b -> b -> c) -> (a -> b) -> a -> a -> c 對兩個引數應用函式,因此:
import Data.Function(on)
ownMax :: (Foldable t, Ord b) => (a -> b) -> t a -> a
ownMax f = maximumBy (compare `on` f)
甚至更短:
import Data.Function(on)
ownMax :: (Foldable t, Ord b) => (a -> b) -> t a -> a
ownMax = maximumBy . on compare
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/374153.html
