OCaml стандартная реализация fold_left: вопрос о синтаксисе - PullRequest
0 голосов
/ 22 октября 2018

Я учу OCaml.В настоящее время я рассматриваю некоторые реализации итераторов по умолчанию для списков, и меня немного смущает одна часть fold_left.

let rec fold_left f accu l =
  match l with
    [] -> accu
  | a::l -> fold_left f (f accu a) l

Часть, в которой я запутался, это (f accu a),Я разобью его настолько, насколько я понимаю.

  • f - это функция, переданная в fold_left, которая должна применяться к каждому элементу в списке.
  • accu - это аккумулятор, который отслеживает сложенную сумму.
  • a - это элемент во главе l, список передан в fold_left.

Почему аккумулятор передается в f?Разве это не должна быть сумма аккумулятора и возвращаемое значение f a?

И как все это возвращает один int, каким должен быть аккумулятор (предположительно)?1027 *

1 Ответ

0 голосов
/ 22 октября 2018

Сгибание является полностью общим, оно не только для сложения чисел.

Функция f может быть любой функцией, которая получает накопленное значение (любого типа) и новое значение из списка,и возвращает новое накопленное значение.Это единственное требование.

Вы можете представить fold_left f init [a; b; c; d] как короткий способ написать это выражение:

f (f (f (f init a) b) c) d

Опять же, f может быть любой функцией, тип которой является правильным дляНакопленная стоимость и элементы списка.

...