Qual é a diferença entre uma seqüência e uma coleção no Clojure
Eu sou um programador Java e sou novo no Clojure. De diferentes lugares, vi sequência e coleção são usados em diferentes casos. No entanto, não tenho ideia de qual é a diferença exata entre eles.
Por alguns exemplos:
1) Na documentação do Clojure paraSeqüência:
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.
Como você pode ver, ao descrever a interface Seq, as duas primeiras funções (first / rest) usamcoll
o que parece indicar que esta é uma coleção enquanto ocons
uso de funçãoseq
o que parece indicar que isso é uma sequência.
2) Existem funções chamadascoll?
eseq?
que pode ser usado para testar se um valor é uma coleção ou uma sequência. É claramente coleção e seqüência são diferentes.
3) Na documentação do Clojure sobre 'Coleções', é dito:
Como as coleções suportam a função seq, todas as funções de sequência podem ser usadas com qualquer coleção
Isso significa que todas as coleções são seqüências?
(coll? [1 2 3]) ; => true
(seq? [1 2 3]) ; => false
O código acima me diz que não é assim porque[1 2 3]
é uma coleção, mas não é uma sequência.
Eu acho que esta é uma questão bastante básica para o Clojure, mas eu não sou capaz de encontrar um lugar explicando isso claramente qual é a diferença deles e qual deles devo usar em casos diferentes. Qualquer comentário é apreciado.