Map.fold в OCaml - PullRequest
       51

Map.fold в OCaml

0 голосов
/ 28 сентября 2018

Я читал документацию для Map.fold по следующей ссылке :

val fold : (key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b

Схожа ли эта функция с List.fold_left?Я новичок в OCaml, и мне сложно разобрать описание аргументов для функций.Насколько я понимаю, Map.fold применяет функцию к записям на карте, а затем сохраняет эти записи на новой карте или в каком-либо аккумуляторе.Это правильное понимание?Я знаю, что 'a означает значение любого типа - означает ли 'b новое значение, преобразованное функцией?

1 Ответ

0 голосов
/ 28 сентября 2018

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
...