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