2015-08-05 4 views
4

Есть ли векторная альтернатива Data.List's cycle?Haskell цикл вектор

Data.Vector документы имеют раздел под названием Recycling support, что кажется, что это то, что я хотел бы, но функции new и clone явно не делать то, что делает cycle.

Решение, о котором я думал, просто повторно индексирует вектор с помощью (счетчик mod длины вектора).

Примером того, что мне нужно было сделать, является необходимость бесконечного списка случайных перетасованных сеток, но решетки большие, и поэтому хранение миллионов из них в памяти не является идеальным. Я понял, что неважно, был ли цикл случайных относительно небольшим, поэтому вместо этого я создал список из нескольких сотен сеток, а затем использовал Data.List.cycle, чтобы дать иллюзию бесконечной длины. Теперь я преобразовал сетки list в сетки сетки Vector и больше не может использовать cycle.

+3

Можете ли вы привести конкретный пример того, что вы хотите сделать? – ErikR

ответ

9

№. Существующие векторные в векторном пакете выделяют по крайней мере позвоночник, и поэтому вы не можете иметь Vector.cycle без бесконечной памяти.

Например, Data.Vector использует Data.Primitive.Array.

Поскольку внутренности векторного пакета (например, Data.Vector.Generic.*) позволяют гибко определять другие типы векторов, вы можете создать векторный тип, который вычисляет индекс по модулю длины, чтобы обеспечить циклическое поведение (и включает смещение для использования с drop). Таким образом, строительство возможно, просто не сделано.

2

Если вы хотите получить конечное представление циклических списков (а не векторов, чтобы вы по-прежнему имели время доступа, линейное по размеру цикла), вы можете посмотреть на this module. Я играл с прошлым годом.

Кстати, причина, по которой the type of fold довольно странная, - explained here. По сути, идея состоит в том, что мы можем или не можем решить развернуть цикл в зависимости от того, используем ли мы индукционное предположение, данное нам.

Смежные вопросы