Подтвердить что ты не робот

Библиотеки для строгих структур данных в Haskell

Какие существуют библиотеки, которые реализуют строгие структуры данных? В частности, я ищу строгие списки и строгие наборы.

Отказ от ответственности:

  • Я знаю о глубине. Это очень полезно, но он добавляет накладные расходы на перемещение всей структуры данных каждый раз, когда вы используете deepseq (что может быть несколько раз).

  • Я знаю, что строгая структура данных, подобная контейнеру, не обеспечить все, что он содержит, будет полностью оценена, но структура сам должен быть строгим, например:

    data StrictList a = !a :$ !(StrictList a) | Empty
    

    (Здесь содержащиеся элементы находятся в WHNF и, возможно, не полностью оценены, но структура списка такова. Например, бесконечные списки будут непереходными значениями.)

  • Я знаю о "строгом" пакете хака, но он очень ограниченный набор строгих структур данных. Он не содержит строгих списков и наборов.

  • Написание строгих списков может показаться удивительно легким (я люблю ghc's расширения для получения Functor, Traversable и Foldable, кстати.), но это по-прежнему кажется, что лучше было бы сделать это в отдельной библиотеке. А также эффективные реализации множеств не кажутся мне тривиальными.

4b9b3361

Ответ 1

Пакет containers (поставляется с ghc) скоро будет иметь строгие варианты Set и Map (я не уверен, что они будут включены с ghc-7.4, но есть причина надеяться). Таким образом, эффективная реализация строгих наборов и карт уже в пути. Строгие списки - это, как вы говорите, все же пакет для халата, который им предоставит, будет приятным, поэтому не каждый должен делать это сам. Что еще вам нужно?

Ответ 2

Для вашего второго пункта термин, который я видел чаще всего, является строгим.

Для строкового списка с позвоночником вы, вероятно, можете использовать Data.Seq.Sequence (из контейнеров) или Data.Vector (из vector). Ни один из них не является списком, однако в зависимости от того, что вы делаете (или и того и другого), вероятно, будет лучше. Последовательность обеспечивает O (1) минусы и snoc, с очень быстрым доступом к любому концу структуры. Векторная производительность похожа на массив. Если вам нужен более похожий на список интерфейс Sequence, вы можете рассмотреть пакет ListLike (там также есть интерфейс ListLike для векторов, но он менее полезен, потому что Вектор предоставляет довольно полный интерфейс самостоятельно). Оба они строгие.

Для строгих наборов вы можете попробовать unordered-containers, который также предоставляет строгую карту.