List 如何在iterable列表中应用函数
所以我是OCaml新手,我在列表方面遇到了一些问题。 我所拥有的是一份Char列表,如下所示: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是一种函数式语言,因此我们希望尝试将过程分解为尽可能多的函数部分 第一步是“列一张清单,列出所有的组合”。
让字母=[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
函数会很有帮助。它们中的每一个都是一个简单的一行或两行递归定义,并且对您自己编写非常有指导意义