Коллекции Haskell с гарантированными наихудшими оценками для каждой отдельной операции?
Такие структуры необходимы для приложений реального времени - например, пользовательских интерфейсов. (Пользователям все равно, если нажатие кнопки занимает 0,1 с или 0,2 с, но им все равно, если сотый щелчок вызовет выдающиеся ленивые вычисления и потребуется 10 с, чтобы продолжить.)
Я читал тезис ОкасакиЧисто функциональные структуры данных и он описывает интересный общий метод для преобразования ленивых структур данных с амортизированными границами в структуры с тем жеworst-case bounds for every operation, Идея состоит в том, чтобы распределять вычисления таким образом, чтобы при каждом обновлении использовалась некоторая часть неоцененных блоков.
Интересно, есть ли такая реализация стандартных коллекций (Map
, Set
и т.д.) в Хаскеле?
контейнеры пакет говорит
The declared cost of each operation is either worst-case or amortized, but remains valid even if structures are shared.
поэтому нет гарантии для наихудших оценок для одной операции. Есть строгие варианты, такие какData.Map.Strict
, но они строги в своих ключах и ценностях:
Key and value arguments are evaluated to WHNF; Keys and values are evaluated to WHNF before they are stored in the map.
нет ничего о (возможной) строгости его структуры.