Почему ghc оценивает мой бесконечный список?

StackOverflow https://stackoverflow.com/questions/1450411

  •  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 вернет функцию, ожидающую список.

Другие советы

Невозможно сортировать бесконечные списки за конечное время.

В качестве доказательства примем, что сортировка включает в себя поиск минимального элемента, а чтобы найти минимум в бесконечном списке, вам нужно проверить каждый элемент в списке, что займет бесконечное время.

Однако в вашем случае вы знаете, что список уже отсортирован.Это делает его особым случаем сортировки бесконечных списков, а именно сортировкой отсортированных списков.Этот случай разрешим.

Вы пытаетесь отсортировать бесконечный список.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top