Поработав еще немного, я думаю, что у меня есть лучшее понимание последовательностей в Racket и в data/collection
.Я постараюсь обобщить все пункты, которые были подняты в других ответах и комментариях, а также включу мои собственные уроки.
Последовательности ракеток, то есть те, которые встроены,предназначен для универсального интерфейса для всех упорядоченных коллекций, так же, как вы можете использовать функции dict-*
для работы с любым типом словаря, включая хэши.Кроме того, есть также много удобных утилит, которые предоставляют встроенные последовательности, облегчающие работу с упорядоченными данными в различных сценариях, например, последовательность элементов, взятых из коллекции, или последовательность входов, полученных на некотором входном порте, или последовательностьпар ключ-значение, взятых из словаря - последняя из которых по своей природе не является «упорядоченной» коллекцией, но которую можно рассматривать как одну, используя встроенный интерфейс последовательности.
Таким образом, мы можемПредставьте, что встроенные последовательности имеют двойную цель:
- как единый интерфейс для упорядоченных данных, и
- , позволяющий удобно работать с последовательностями в различных сценариях, предоставляя естественный интерфейс последовательностиреализации в каждом конкретном случае.
Теперь, хотя встроенные последовательности теоретически предназначены для унифицированного интерфейса для упорядоченных коллекций, на практике они не особенно пригодны для этой цели из-за их многословия, например sequence-take
и sequence-length
вместо take
иlength
, которые мы использовали бы для списков.
data/collection
последовательности устраняют этот недостаток, поскольку их имена являются короткими и каноническими, например take
вместо sequence-take
.Кроме того, эти последовательности также обеспечивают вставные замены для многих утилит последовательностей, предоставляемых встроенными последовательностями, таких как cycle
и naturals
вместо in-cycle
и in-naturals
, наряду с универсальнымin
функция для получения отложенных версий любой последовательности для использования в итерации (например, (in (naturals))
).Эти data/collection
версии, как правило, более "хорошо себя ведут" благодаря своей неизменности, что встроенные последовательности не гарантируют.В результате во многих случаях последовательности data/collection
можно рассматривать как замену для встроенных последовательностей, в значительной степени взяв на себя первую из двух целей встроенных последовательностей.
То есть в тех местах, где вы имеете дело с последовательностями, рассмотрите возможность использования data/collection
последовательностей вместо встроенных последовательностей, а не как способ работать с встроенными последовательностями.
В точке (2), однако, ниже перечислены типы, которые в настоящее время могут обрабатываться как последовательности данных / сбора:
- списки
- неизменяемые хеш-таблицы
- неизменных векторов
- неизменных хеш-наборов
- неизменных словарей
- потоков
( источник )
Это достаточно, но есть еще больше сценариев, в которых может быть получена последовательность здравого смысла.Для любых таких случаев, которые не охвачены выше, утилиты встроенных последовательностей по-прежнему полезны, такие как in-hash
и in-port
, которые не имеют аналогов в data/collection
последовательностях.В целом, во многих случаях мы можем легко получить встроенную последовательность (см. Утилиты здесь ), но не последовательность data/collection
.В этих особых случаях мы могли бы просто преобразовать полученную таким образом встроенную последовательность в поток через sequence->stream
, а затем использовать ее через более простой интерфейс последовательности data/collection
, поскольку потоки можно обрабатывать как последовательности любого типа.