如何在可迭代列表中应用函数
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
函数可能会很有帮助。每一个都是简单的一两行递归定义,对自己写很有指导意义。
所以我是 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
函数可能会很有帮助。每一个都是简单的一两行递归定义,对自己写很有指导意义。