Я изучаю Haskell в настоящее время (будучи программистом по профессии, но это моя первая попытка на функциональном языке).
Я хочу написать функцию, которая сканирует список и возвращает как минимальный, так и максимальный элемент этого списка. Выбирайте функции Prelude minimum
и maximum
, но оба они одновременно. Я придумал следующий код:
import Data.List
-- Declaration of rand
minMax :: [Int] -> Maybe (Int, Int)
minMax [] = Nothing
minMax (x:xs) = Just (foldl' f (x, x) xs)
where
f (a, b) c = (if c < a then c else a, if c > b then c else b)
rand
- это функция, которая генерирует бесконечный список чисел.
Дело в том, что когда я добавляю следующую функцию main
:
main = print $ minMax $ take 1000000 $ rand 7666532
компилировать и запускать все это с помощью профилирования, он показывает, что он использует более 200 МБ памяти, поэтому он определенно не является функцией постоянного пространства (что мне бы хотелось).
Вопрос в том, почему и что я должен изменить, чтобы исправить это. Насколько я понимаю, foldl'
складывает список слева (так же, как он сгенерирован) и не ленится, поэтому я не понимаю, почему использование памяти настолько велико. Я уверен, что функция minMax
неверна, поскольку просто печатает указанный список, используя
main = print $ take 1000000 $ rand 7666532
дает мне 1MB-использование, что-то, что я понимаю и ожидаю.