Может ли кто-нибудь объяснить мне, почему эта функция работает. Я знаю, как работает фильтр, он использует предикатную функцию и список. В этом def maximaBy valueFcn xs = filter isMaxVal
xs Фильтр принимает isMaxVal как предикат, а xs - это список. , но я у меня возникают проблемы с пониманиемТребуется функция Haskell
where
isMaxVal xs = valueFcn xs == maxVal
Here isMaxVal is defined as a function that takes xs as an argument but how is that possible xs is an agrument of filter.
if we change valueFcn to function length
we get
isMaxVal xs = length xs == maxVal
if xs is ["cs", "efd", "lth", "it"] length of this is 4 but maxVal ==3
maxVal = maximum (map length ["cs", "efd", "lth", "it"]) ==3
-- maximaBy length ["cs", "efd", "lth", "it"] == ["efd", "lth"]
maximaBy :: Ord b => (a -> b) -> [a] -> [a]
maximaBy valueFcn xs = filter isMaxVal xs
where
isMaxVal xs = valueFcn xs == maxVal
maxVal = maximum (map valueFcn xs)
Для записи есть уже готовая функция ['MaximumBy'] (http://hackage.haskell.org/package/base-4.6.0.1/docs/Data-List.html#v:maximumBy) , –