List.fold_left仅适用于一个参数

时间:2019-01-13 18:31:24

标签: ocaml

我不理解以下代码:

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 :(得分:0)

在这一行

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 *)

请注意,这种解释甚至不一致。它既不是左联想也不是右联想。但这是您所假设的解释。