Map.fold
очень похоже на List.fold_left
.Обратите внимание, что List.fold_left
сам по себе не создает новый список.Это более общий подход - он поддерживает значение любого желаемого типа, поскольку обрабатывает элементы списка.
Аналогично, Map.fold
постепенно вычисляет значение любого требуемого типа (типа 'b
вподпись типа, которую вы даете), поскольку она обрабатывает элементы карты.
Чтобы сделать это, вы предоставляете функцию трех аргументов, которая обрабатывает один элемент карты.Первый аргумент является ключом для элемента карты.Второй аргумент - это значение элемента карты.Третий аргумент - текущее значение, которое вычисляется постепенно.Возвращаемое значение функции - это новое вычисляемое значение.
После обработки всех элементов карты Map.fold
возвращает окончательное значение типа 'b
.
Вот функцияэто добавляет элементы списка с помощью List.fold_left
:
let list_sum l =
List.fold_left (+) 0 l
При построении карты вам необходимо указать тип ключей.Вот функция, которая суммирует значения карты, ключи которой являются строками:
module StringMap = Map.Make(String)
let map_sum m =
StringMap.fold (fun k v accum -> v + accum) m 0