List.fold_在OCaml中向左

List.fold_在OCaml中向左,ocaml,Ocaml,我编写了一个函数,它添加给定列表中的所有元素: let rec add=function[]->0 | h::t->h+add(t) 现在我想编写相同的函数,但使用的是List.fold_left,但我尝试了一些更改,但仍然有一个错误。首先,我尝试了这个: let rec add=function[]->0 | h::t->add List.fold_left((fun h t->h+t)h t) 但是我有一个错误,我注意到List.fold_left返回一个int值,因此不需要递归。所以我换了

我编写了一个函数,它添加给定列表中的所有元素:

let rec add=function[]->0 | h::t->h+add(t)

现在我想编写相同的函数,但使用的是
List.fold_left
,但我尝试了一些更改,但仍然有一个错误。首先,我尝试了这个:

let rec add=function[]->0 | h::t->add List.fold_left((fun h t->h+t)h t)

但是我有一个错误,我注意到List.fold_left返回一个int值,因此不需要递归。所以我换了:

let add=function[]->0 | h::t->List.fold_left(fun h t->h+t h t)

但我仍然发现错误类型的错误:
错误:此表达式的类型为int->'a->'b
但表达式应为“a”类型

但是我不知道如何解决这个问题,有人能解释我如何使用
列表吗?在这个例子中,fold\u left

fold\u left操作列表,就像你的函数一样,通过应用一个函数并以特定的方式累积结果。它为您处理并抽象递归。它处理列表的结构,因此您可以处理如何以特定方式组合列表的元素。因此,您需要找出要应用于fold_left的高阶函数,该函数以相同的方式对列表进行操作

例如,这里有两种方法来获取列表的最大元素

let rec max_list smallest lst = match lst with 
    | []   -> smallest
    | h::t -> max_list (max smallest h) t

let max_list smallest lst =
    List.fold_left (fun acc x -> max acc x) smallest lst
你会注意到函数在某些方面的相似性;基本情况(最小)以及如何组合元素(使用函数max)。你应该在你的功能中看到相同的相似之处

回顾您的最终实现

let add = function | []->0
                   | h::t -> List.fold_left (fun h t-> h+t h t)
这里的问题是你的括号放错了地方

let add = function | []->0
                   | h::t -> List.fold_left (fun h t-> h+t) h t

但这可以简化,类似于我上面的示例。

fold\u left通过应用函数并以特定方式累积结果,对列表进行操作,就像您的函数一样。它为您处理并抽象递归。它处理列表的结构,因此您可以处理如何以特定方式组合列表的元素。因此,您需要找出要应用于fold_left的高阶函数,该函数以相同的方式对列表进行操作

例如,这里有两种方法来获取列表的最大元素

let rec max_list smallest lst = match lst with 
    | []   -> smallest
    | h::t -> max_list (max smallest h) t

let max_list smallest lst =
    List.fold_left (fun acc x -> max acc x) smallest lst
你会注意到函数在某些方面的相似性;基本情况(最小)以及如何组合元素(使用函数max)。你应该在你的功能中看到相同的相似之处

回顾您的最终实现

let add = function | []->0
                   | h::t -> List.fold_left (fun h t-> h+t h t)
这里的问题是你的括号放错了地方

let add = function | []->0
                   | h::t -> List.fold_left (fun h t-> h+t) h t

但这可以简化,类似于我上面的示例。

一种添加整数列表的方法:

# List.fold_left (+) 0 [1; 3; 5; 7];;
- : int = 16

添加整数列表的一种方法:

# List.fold_left (+) 0 [1; 3; 5; 7];;
- : int = 16

如果使用Core.Std,则需要命名参数,例如:

List.fold_left ~f:(+) ~init:0 [1; 3; 5; 7];;
- : int = 16

如果使用Core.Std,则需要命名参数,例如:

List.fold_left ~f:(+) ~init:0 [1; 3; 5; 7];;
- : int = 16