如何在可迭代列表中应用函数

How to apply a function in an iterable list

所以我是 OCaml 的新手,我在使用列表时遇到了一些问题。 我有一个字符列表,如下所示:

let letters = [a;b;c;d]

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

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

第 1 步是“获取事物列表并生成所有组合”。我们不在乎之后会发生什么;我们只想知道所有这些组合。如果您希望每个组合只出现一次(即 (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 module 中的内容。如果您想将函数应用于每一对以产生副作用,List.iter 就可以了。如果你想把结果累积到一个新的列表中,List.map 就可以了。如果你想应用一些操作来组合结果(比如,每个函数 returns 一个数字并且你想要数字的总和),然后 List.map 后跟 List.fold_left (或复合List.fold_left_map) 就可以了。

当然,如果您刚刚起步,那么自己编写这些 List 函数可能会很有帮助。每一个都是简单的一两行递归定义,对自己写很有指导意义。