Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何在iterable列表中应用函数_List_Function_Loops_Functional Programming_Ocaml - Fatal编程技术网

List 如何在iterable列表中应用函数

List 如何在iterable列表中应用函数,list,function,loops,functional-programming,ocaml,List,Function,Loops,Functional Programming,Ocaml,所以我是OCaml新手,我在列表方面遇到了一些问题。 我所拥有的是一份Char列表,如下所示: 让字母=[a;b;c;d] 我想知道如何迭代列表并应用函数,该函数将列表上两个字符的每个可能组合(do_someting char1 char2)作为参数,例如:a和b(do_something a b),a和c。。。。d和b,d和c;永远不要重复同一个元素(a和a或c和c不应该发生)。OCaml是一种函数式语言,因此我们希望尝试将过程分解为尽可能多的函数部分 第一步是“列一张清单,列出所有的组合”。

所以我是OCaml新手,我在列表方面遇到了一些问题。 我所拥有的是一份Char列表,如下所示:

让字母=[a;b;c;d]


我想知道如何迭代列表并应用函数,该函数将列表上两个字符的每个可能组合(do_someting char1 char2)作为参数,例如:a和b(do_something a b),a和c。。。。d和b,d和c;永远不要重复同一个元素(a和a或c和c不应该发生)。

OCaml是一种函数式语言,因此我们希望尝试将过程分解为尽可能多的函数部分

第一步是“列一张清单,列出所有的组合”。我们不在乎之后会发生什么;我们只想知道所有这些组合。如果您希望每个组合只出现一次(即在您的示例中,
(a,b)
将出现,但
(b,a)
不会出现),那么简单的递归定义就足够了

let rec ordered_pairs xs =
  match xs with
  | [] -> []
  | (x :: xs) -> List.append (List.map (fun y -> (x, y)) xs) (ordered_pairs xs)
如果您想要反向副本(
(a,b)
(b,a)
),那么我们可以在末尾添加它们

let swap (x, y) = (y, x)

let all_ordered_pairs xs =
  let p = ordered_pairs xs in
  List.append p (List.map swap p)
现在我们有了所有元组的列表。接下来会发生什么取决于你想要什么样的结果。很有可能,您正在从内置系统中查看某些内容。如果您想将该函数应用于每一对副作用,请使用
List.iter
。如果要将结果累加到一个新列表中,
list.map
。如果您想应用一些操作来组合结果(例如,每个函数返回一个数字,您需要这些数字的总和),那么
List.map
后跟
List.fold\u left
(或组合
List.fold\u map
)就可以了


当然,如果您刚刚开始,自己编写这些
List
函数会很有帮助。它们中的每一个都是一个简单的一行或两行递归定义,并且对您自己编写非常有指导意义。

OCaml是一种函数式语言,因此我们希望尝试将过程分解为尽可能多的函数部分

第一步是“列一张清单,列出所有的组合”。我们不在乎之后会发生什么;我们只想知道所有这些组合。如果您希望每个组合只出现一次(即在您的示例中,
(a,b)
将出现,但
(b,a)
不会出现),那么简单的递归定义就足够了

let rec ordered_pairs xs =
  match xs with
  | [] -> []
  | (x :: xs) -> List.append (List.map (fun y -> (x, y)) xs) (ordered_pairs xs)
如果您想要反向副本(
(a,b)
(b,a)
),那么我们可以在末尾添加它们

let swap (x, y) = (y, x)

let all_ordered_pairs xs =
  let p = ordered_pairs xs in
  List.append p (List.map swap p)
现在我们有了所有元组的列表。接下来会发生什么取决于你想要什么样的结果。很有可能,您正在从内置系统中查看某些内容。如果您想将该函数应用于每一对副作用,请使用
List.iter
。如果要将结果累加到一个新列表中,
list.map
。如果您想应用一些操作来组合结果(例如,每个函数返回一个数字,您需要这些数字的总和),那么
List.map
后跟
List.fold\u left
(或组合
List.fold\u map
)就可以了

当然,如果您刚刚开始,自己编写这些
List
函数会很有帮助。它们中的每一个都是一个简单的一行或两行递归定义,并且对您自己编写非常有指导意义