List.fold_left применяется только с одним аргументом - PullRequest
0 голосов
/ 13 января 2019

Я не понимаю следующий код:

type 'a b_tree = Empty | Node of 'a*'a b_tree*'a b_tree


  let add_trees_with left right all =
    let add_right_tree all l =
      List.fold_left (fun a r -> Node('x', l, r) :: a) all right in
    List.fold_left add_right_tree all left

Я не понимаю, что будет после части in. List.fold_left нужно иметь три аргумента, тогда как после in мы даем только один аргумент List.fold_left, который равен add_right_tree all left.

Итак, как этот код компилируется?

Разве это не должно быть?

type 'a b_tree = Empty | Node of 'a*'a b_tree*'a b_tree


  let add_trees_with left right all =
    let add_right_tree all l =
      List.fold_left (fun a r -> Node('x', l, r) :: a) all right in
    add_right_tree all left

1 Ответ

0 голосов
/ 13 января 2019

В этой строке

List.fold_left add_right_tree all left

У функции List.fold_left есть три аргумента. Вызовы функций остаются ассоциативными, поэтому версия в скобках будет выглядеть так:

((List.fold_left add_right_tree) all) left

Поскольку List.fold_left определен в форме карри, это точно способ передать три аргумента.

Скобки не выглядят так:

List.fold_left ((add_right_tree all) left) (* NOT SO *)

Обратите внимание, что эта интерпретация даже не соответствует. Это ни левая ассоциация, ни правая ассоциация. Но это та интерпретация, которую вы предполагаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...