В чем разница между последовательностью и коллекцией в Clojure
Я программист Java и новичок в Clojure. Из разных мест я видел, что последовательность и коллекция используются в разных случаях. Однако я понятия не имею, в чем разница между ними.
пример:
1) в документации Clojure для последовательность:
The Seq interface
(first coll)
Returns the first item in the collection.
Calls seq on its argument. If coll is nil, returns nil.
(rest coll)
Returns a sequence of the items after the first. Calls seq on its argument.
If there are no more items, returns a logical sequence for which seq returns nil.
(cons item seq)
Returns a new seq where item is the first element and seq is the rest.
как вы можете видеть, при описании интерфейса Seq первые две функции (first/rest) используют coll
что, похоже, указывает на то, что это коллекция в то время как cons
использование функции seq
что, похоже, указывает на то, что это последовательность.
2) есть функции, называемые coll?
и seq?
это можно использовать для проверки, является ли значение коллекцией или последовательностью. Очевидно, что коллекция и последовательность различны.
3) в документации Clojure о'коллекции', он сказал:
поскольку коллекции поддерживают функцию seq, вся последовательность функции можно использовать с любая коллекция
означает ли это, что все коллекции являются последовательностями?
(coll? [1 2 3]) ; => true
(seq? [1 2 3]) ; => false
код выше говорит мне, что это не такой случай, потому что [1 2 3]
- это коллекция, а не последовательность.
Я думаю, что это довольно простой вопрос для Clojure, но я не могу найти место, объясняющее это ясно, в чем их разница и какой из них я должен использовать в разных случаях. Любой комментарий приветствуется.
5 ответов
каждая последовательность-это набор, но не каждая коллекция-это последовательность.
на seq
функция позволяет преобразовать коллекцию в последовательность. Е. Г. для карты вы получите список его записей. Однако этот список записей отличается от самой карты.
любой объект, поддерживающий ядро first
и rest
функции sequence
.
многие объекты удовлетворяют этому интерфейсу, и каждая коллекция Clojure предоставляет по крайней мере один вид объекта seq для просмотра его содержимого с помощью
на Clojure для храбрых и истинных автор подводит итог действительно понятным образом:
абстракция коллекции тесно связана с последовательностью абстракция. Все основные структуры данных Clojure - векторные карты, списки и наборы-участвуют в обеих абстракциях.
абстракции отличаются тем, что абстракция последовательности "об" работа с членами по отдельности во время абстракции коллекции есть "о" структуре данных в целом. Например, коллекция функции
count
,empty?
иevery?
не о каких-то отдельных элемент; они о целом.
вот несколько моментов, которые помогут понять разницу между коллекция и последовательность.
"коллекция" и "последовательность" являются абстракциями, а не свойством, которое может быть определено из заданного значения.
коллекции сумок значений.
Sequence-это структура данных (подмножество коллекции), доступ к которой ожидается в последовательном (линейном) манера.
рисунок ниже лучше всего описывает отношение между ними:
вы можете прочитать больше об этом здесь.
на seq?
:
верните true, если x реализует ISeq
на coll?
:
возвращает true, если x реализует IPersistentCollection
и я нашел индекса iseq интерфейс простирается от IPersistentCollection в Clojure исходный код, так как сказал Rörd, каждый последовательностей представляет собой сборник.