Следующие примеры производят тот же вывод.В чем разница между seq и sequence в Clojure?
(seq [1 2 3 4])
=> (1 2 3 4)
(sequence [1 2 3 4])
=> (1 2 3 4)
Следующие примеры производят тот же вывод.В чем разница между seq и sequence в Clojure?
(seq [1 2 3 4])
=> (1 2 3 4)
(sequence [1 2 3 4])
=> (1 2 3 4)
Разница заключается в том, что sequence
всегда возвращает SEQ даже если коллекция пуста (в этом случае пустой список), в то время как seq
возвращает nil
для пустых коллекций. Кроме того, sequence
может использоваться с transducers.
Взгляд в исходный код:
user=> (source sequence)
(defn sequence
"Coerces coll to a (possibly empty) sequence, if it is not already
one. Will not force a lazy seq. (sequence nil) yields(), ..."
([coll]
(if (seq? coll) coll
(or (seq coll)())))
...
Так вызывая sequence
только коллекции вызывает seq
на коллекции, если это не уже последующие и возвращает пустой список, если коллекция была nil
.
прежде всего, они относятся к пустому аргументу последовательности по-разному:
user> (seq nil)
nil
user> (seq())
nil
user> (sequence())
()
user> (sequence nil)
()
также sequence
имеет дополнительные арностей для работы на преобразователях
от Docs:
Clojure. сердцевина/последовательность
[Coll]
[XForm Coll]
[XForm Coll & colls]
Добавлено в 1,0 Колл Осуществляет приведение (возможно, пустой) последовательности, если она уже не один. Не заставит ленивый след. (последовательность nil) дает(), когда подается преобразователь , возвращает ленивую последовательность приложений преобразование в элементы в столбцах, то есть к набору первых элементов каждого колла, а затем набор из вторых предметов в каждом столбе, до тех пор, пока не будет исчерпан любой из колов. Любые остальных элементов в других коллах игнорируются. Преобразование должны принимать числа-colls аргументы
clojure.core/сл
[Coll]
Добавлены в 1,0 Возвращает НомерСтарт на коллекции. Если коллекция пуста, возвращает nil. (seq nil) возвращает nil. seq также работает с Строками, родными массивами Java (ссылочных типов) и любыми объектами , реализующими Iterable. Обратите внимание, что значения кэша seqs, поэтому seq не должны использоваться ни на одной итерации, чей итератор повторно возвращает тот же измененный объект.
Я думаю [это ответ] (http://clojuredocs.org/clojure.core/seq) [в документации] (http://clojuredocs.org/clojure.core/sequence). – m0skit0