首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数在OCaml中平放`('a list* b‘list) list` to’a list * 'b list‘

函数在OCaml中平放`('a list* b‘list) list` to’a list * 'b list‘
EN

Stack Overflow用户
提问于 2016-01-20 22:44:56
回答 4查看 920关注 0票数 1

我需要一个OCaml中的函数,该函数将采用一种('a list * b' list) list类型,并对其进行构造。

'a list * b' list。我尝试过内置函数List.flatten和List.concat,但它们不能工作,它们需要一种'c list list类型。有人能帮我吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-01-20 22:52:39

您可以使用这样的函数fold_left来完成它:

从两个空列表开始,作为累加器。对于输入列表中的每个子列表,将元素添加到相应的累加器中(第一个累加器中的第一个子列表的元素和第二个子列表的元素相同)。

代码语言:javascript
复制
# 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>
# 
票数 1
EN

Stack Overflow用户

发布于 2016-01-21 10:42:22

您必须使用List.splitList.flatten函数

代码语言:javascript
复制
 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

票数 2
EN

Stack Overflow用户

发布于 2016-01-21 18:33:38

不幸的是,没有元组的映射,您需要分解-例如使用使用拆分和扁平:

代码语言:javascript
复制
let splcat x = match List.split x with | (a,b) -> (List.flatten a, List.flatten b) ;;

这就是它在命令行上的样子:

代码语言:javascript
复制
utop # splcat [([1;2],["a"]); ([3],["uvw";"xyz"]) ] ;;
- : int list * bytes list = ([1; 2; 3], ["a"; "uvw"; "xyz"])     
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34912078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档