如何在没有递归ocaml的情况下展平列表?

时间:2015-10-04 17:26:43

标签: functional-programming ocaml fold flatten

如何将整数列表的列表压缩为ocaml中的单个整数列表?该功能将如下所示。

[[1;2];[3;4;5];[];[6]] -> [1;2;3;4;5;6]

由于这是家庭作业,必须只使用fold_left或fold_right,并且不能使用' @'运算符,不能使用递归。我得到累加器将成为新列表的成员,但我不知道如何将原始列表的元素实际移动到累加器。任何提示都将不胜感激。

2 个答案:

答案 0 :(得分:2)

以下是一些提示:

一个。将值移动到累加器并不困难。如果您的值为x且累加器为a,则只需撰写x :: a

湾您通常需要以一致的顺序处理所有内部值。那是什么折叠。

℃。折叠用于处理列表的元素。但是你有一份清单。

答案 1 :(得分:0)

List.fold_left (fun liRes la -> 
  List.fold_right ( fun iRes la ->
    iRes::la    
  ) liRes la
) [] [[1;2];[3;4;5];[];[6]]

结果:

- : int list = [1; 2; 3; 4; 5; 6]

其他形式:

let (@) =
  List.fold_right ( fun iRes la ->
    iRes::la
  );;

 List.fold_left (fun liRes la -> 
   liRes @ la
 ) [] [[1;2];[3;4;5];[];[6]];;

您可以尝试:

# []@[1;2];;
- : int list = [1; 2]
# (@) [1;2] [3;4];;
- : int list = [1; 2; 3; 4]