Нахождение максимального аргумента списка в Haskell

Я решал задачи проекта Эйлера в Haskell и часто обнаруживал необходимость получить значение, которое дает максимум функции.

Например,

answer = argmaximum $ map collatzLength [1..10^6]

Где collatzLength – это ранее определенная функция.

Я придумал этот код, на который сильно повлияло изучение Ocaml. Я запускаю вспомогательную функцию, в которой есть переменные, которые отслеживают лучший индекс значения и лучший индекс на данный момент. Он отлично работает для положительных списков, но, похоже, есть способ получше.

Есть ли менее неуклюжий способ реализовать argmaximum?

argmaximum :: (Ord a, Num a) => [a] -> a
argmaximum lst = helper lst 0 0 0 where
  helper (x:xs) current bestVal bestIndex
    | current > bestVal = helper xs (current + 1) x current
    | otherwise = helper xs (current + 1) bestVal bestIndex
  helper null _ _ bestIndex = bestIndex

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *