我需要一个OCaml中的函数,该函数将采用一种('a list * b' list) list类型,并对其进行构造。
'a list * b' list。我尝试过内置函数List.flatten和List.concat,但它们不能工作,它们需要一种'c list list类型。有人能帮我吗?
发布于 2016-01-20 22:52:39
您可以使用这样的函数fold_left来完成它:
从两个空列表开始,作为累加器。对于输入列表中的每个子列表,将元素添加到相应的累加器中(第一个累加器中的第一个子列表的元素和第二个子列表的元素相同)。
# let flatten l =
let (l1,l2) =
List.fold_left (fun (l1,l2) (x,y) ->
(x :: l1, y :: l2)) ([], []) l in
List.rev (List.flatten l1), List.rev (List.flatten l2);;
val flatten : ('a list * 'b list) list -> 'a list * 'b list = <fun>
# 发布于 2016-01-21 10:42:22
您必须使用List.split和List.flatten函数
let my_function l =
let (fst_list, snd_list) = List.split l in
List.flatten fst_list, List.flatten snd_list ;;首先,split函数将生成'a list list和'b list list,然后只需对它们进行flatten。
发布于 2016-01-21 18:33:38
不幸的是,没有元组的映射,您需要分解-例如使用使用拆分和扁平:
let splcat x = match List.split x with | (a,b) -> (List.flatten a, List.flatten b) ;;这就是它在命令行上的样子:
utop # splcat [([1;2],["a"]); ([3],["uvw";"xyz"]) ] ;;
- : int list * bytes list = ([1; 2; 3], ["a"; "uvw"; "xyz"]) https://stackoverflow.com/questions/34912078
复制相似问题