Некоторый общий совет по эффективности в Haskell заключается в том, чтобы быстро создавать структуры данных "spine strict", чтобы структура, но не обязательно ее содержимое, полностью оценивается по мере его создания. Это позволяет нам делать больше работы, когда мы вставляем значение, а структура находится в кеше, а не откладываем его, пока мы не посмотрим на значение вверх.
С обычным типом данных, например двоичным trie из Data.IntMap, это может быть выполнено путем создания соответствующих полей в структуре данных строго:
data IntMap a = Bin {- ... -} !(IntMap a) !(IntMap a)
| {- ... -}
(Выдержка из источника Data.IntMap.Base.)
Как я могу достичь такого же поведения, если я хочу хранить дочерние элементы в векторе, а не непосредственно как поля Bin
?
data IntMap a = Bin {- ... -} (Vector (IntMap a))
| {- ... -}