В чем разница между последовательностью и коллекцией в 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? не о каких-то отдельных элемент; они о целом.


вот несколько моментов, которые помогут понять разницу между коллекция и последовательность.

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

  2. коллекции сумок значений.

  3. Sequence-это структура данных (подмножество коллекции), доступ к которой ожидается в последовательном (линейном) манера.

рисунок ниже лучше всего описывает отношение между ними:

enter image description here

вы можете прочитать больше об этом здесь.


на seq?:

верните true, если x реализует ISeq

на coll?:

возвращает true, если x реализует IPersistentCollection

и я нашел индекса iseq интерфейс простирается от IPersistentCollection в Clojure исходный код, так как сказал Rörd, каждый последовательностей представляет собой сборник.