Разница полностью в представлении памяти. С точки зрения семантики языка они неразличимы — вы не можете написать функцию, которая могла бы отличить их друг от друга, поэтому ваши две версии cycle
считаются двумя реализациями одной и той же функции (они являются точными такое же отображение аргументов в результаты). На самом деле, я не знаю, гарантирует ли определение языка, что один из них цикличен, а другой бесконечен.
Но в любом случае давайте представим искусство ASCII. Циклический список:
+----+----+ +----+----+
| x0 | -----> ... --->| xn | |
+----+----+ +----+-|--+
^ |
| |
+--------------------------------+
Бесконечный список:
+----+----+
| x0 | -----> thunk that produces infinite list
+----+----+
Суть циклического списка в том, что от каждой cons-ячейки в списке есть путь ко всем остальным и самой. Это означает, что с точки зрения сборщика мусора, если одна из cons-ячеек достижима, то достижимы и все. С другой стороны, в простом бесконечном списке нет циклов, поэтому из данной cons-ячейки достижимы только ее потомки.
Обратите внимание, что представление бесконечного списка более эффективно, чем циклическое, потому что циклическое представление работает только со списками, которые повторяются после некоторого количества элементов. Например, список всех простых чисел можно представить как бесконечный список, но не как циклический.
Обратите также внимание, что это различие можно обобщить на два различных способа реализации функции fix
:
fix, fix' :: (a -> a) -> a
fix f = let result = f result in result
fix' f = f (fix' f)
-- Circular version of cycle:
cycle xs = fix (xs++)
-- Infinite list version of cycle:
cycle' xs = fix' (xs++)
Библиотеки GHC соответствуют моему fix
определению. Способ, которым GHC компилирует код, означает, что преобразователь, созданный для result
, используется и как результат, и как аргумент приложения f
. То есть преобразователь при принудительном вызове вызовет объектный код для f
с самим преобразователем в качестве аргумента и заменит содержимое преобразователя результатом.
person
Luis Casillas
schedule
26.08.2014
cycle
обычно дает очень хорошие результаты для коротких циклов, но для длинных, то, как вы используете эту вещь, будет определять, поможет ли представление бесконечного списка или вам лучше изменить структуру ваша программа. - person dfeuer   schedule 27.08.2014