2015-10-04 36 views
1

我该如何将整数列表压扁成ocaml中的一个整数列表?该功能将如下所示。如何平整没有递归ocaml的列表?

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

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

回答

2

这里有一些提示:

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

b。您大多需要以一致的顺序处理所有内部值。这是折叠的目的。

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

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] 
+2

(我不知道它在大画面有助于给代码为某人的作业问题。) –

+1

请广告d对你的代码的一些解释! –