Такие структуры необходимы для приложений реального времени — например, пользовательских интерфейсов. (Пользователей не волнует, занимает ли нажатие кнопки 0,1 с или 0,2 с, но их волнует, если 100-й щелчок приводит к выдающимся ленивым вычислениям и занимает 10 с для продолжения.)
Я читал диссертацию Окасаки Чисто функциональные структуры данных, и он описывает интересный общий метод преобразования ленивых структуры данных с амортизированными границами в структуры с одинаковыми наихудшими границами для каждой операции. Идея состоит в том, чтобы распределить вычисления таким образом, чтобы при каждом обновлении какая-то часть необработанных переходников принудительно выполнялась.
Интересно, есть ли такая реализация стандартных коллекций (Map
, Set
и т.д.) в Haskell?
Пакет контейнеры говорит
Заявленная стоимость каждой операции является наихудшей или амортизированной, но остается действительной, даже если структуры являются общими.
поэтому нет гарантии наихудших оценок для одной операции. Существуют строгие варианты, такие как Data.Map.Strict
, но они строги в своих ключах и значениях:
Аргументы ключа и значения оцениваются как WHNF; Ключи и значения оцениваются как WHNF до того, как они будут сохранены на карте.
нет ничего о (возможной) строгости его структуры.