Концепция бесконечных списков должна быть легко понятна для всех, кто приходит с объектно-ориентированного фона.
Фокус в том, чтобы думать о списках Haskell не как массивы или даже связанные списки, а как объекты-итераторы. Объектом итератора является объект, который имеет два метода: hasNext
и getNext
.
Как правило, номер hasNext
итератора возвращает False
после конечного числа getNext
выписок. Это, безусловно, верно, если вы считаете, что итераторы привязаны к «реальным» коллекциям, такие как массивы, хэш-карты, файлы и т. Д.
Но ничто изначально не заставляет итератор быть «конечным». Вы можете реализовать бесконечный итератор очень легко. В Haskell-подобный псевдокод:
object Iterator where
hasNext _ = True
getNext = do
state <- get
put (state + 1)
return state
Если вы не знаете, как это итератор на самом деле реализуется, просто наблюдая за его поведением вы бы думать, что это связано с бесконечным (или, по крайней мере, очень большой) коллекции. Но это просто - объект, который возвращает последовательные числа.
Другая аналогичная аналогия - это специальные файлы в UNIX, такие как /dev/zero
или /dev/random
. Если бы они были привязаны к реальным файлам на вашем жестком диске, диск был бы бесконечным. Но они не являются - вместо этого содержимое генерируется по требованию ядром, и вы можете требовать столько, сколько захотите.
Нисходящие списки Haskell работают точно так же, за исключением того, что они также «буферизуют» все произведенные значения, так что вы можете их повторно исследовать без повторной оценки.
Кроме того, определение интергера в haskell имеет предел. Является ли теоретическое бесконечное значение числа, определенного в «Num» typeclass рекурсивно или чем-то? Любая помощь была бы потрясающей !!! –
Трюк состоит в том, чтобы создавать только биты бесконечного списка, поскольку они используются. Это называется ленивой оценкой, которая стоит посмотреть вверх. – AndrewC
О, и, хотя 'Int' ограничен машинным представлением,' Integer' способен быть неограниченным большим (ну, в конечном итоге, он будет настолько большим, что вы исчерпаете всю системную память). Наконец, вещи в классе «Num» могут быть конечными или бесконечными - они не должны быть регулярными числами! Просто вещи, которые вы можете разумно добавить/вычесть/размножить/разделить (по сути, вид Кольца, если вы хотите изучить гораздо глубже). –