Почему ghc оценивает мой бесконечный список?
-
11-09-2019 - |
Вопрос
В качестве моей первой программы на Haskell я пытаюсь сделать это — это трудный способ получить от 1 до 10.Я создаю бесконечный список целых чисел, сортирую их и беру первые 10.Мое намерение состояло в том, чтобы убедить себя, что я могу работать с бесконечными списками, не вызывая их оценки за пределами строго (хм), необходимые для требуемого результата.
Мой код..
module Main where
import Data.List
minima n xs = take n (sort xs)
main = do
let x = [1..]
print (minima 10 x)
Компилируем с помощью ghc и запускаем полученный исполняемый файл.он сидит там и распределяет ресурсы, пока его не убьют.
Есть какие-нибудь подсказки?
Решение
Проблема в том, что вы пытаетесь отсортировать бесконечный список.Список никогда не может быть полностью отсортирован, пока не известны все его элементы, поэтому он и зависает.Ваша программа отлично работает с конечным списком.
Кроме того, в качестве второстепенного аспекта вы можете переписать минимумы как
minima n = take n . sort
Из-за частичного применения, minima n
вернет функцию, ожидающую список.
Другие советы
Невозможно сортировать бесконечные списки за конечное время.
В качестве доказательства примем, что сортировка включает в себя поиск минимального элемента, а чтобы найти минимум в бесконечном списке, вам нужно проверить каждый элемент в списке, что займет бесконечное время.
Однако в вашем случае вы знаете, что список уже отсортирован.Это делает его особым случаем сортировки бесконечных списков, а именно сортировкой отсортированных списков.Этот случай разрешим.
Вы пытаетесь отсортировать бесконечный список.