因此,假设我们有一些如下列表:[1; 2; 3; 4; 5; 6]
,并且假设我想在每次调用函数时折叠 2 个元素。
因此,我将按顺序在(1, 2)
、(3, 4)
和上应用该函数。(5, 6)
这是我尝试这样做的功能:
let fold_left_multiple (func: 'a -> 'b list -> 'a) (base: 'a) (lst: 'b list) (items_per_fold: int): 'a * 'b list =
let (acc, remainder, _) = List.fold_left (fun (acc, cur_fold_acc, cur_num) el ->
if cur_num mod items_per_fold = 0 then (func acc (List.rev (el::cur_fold_acc)), [], 1)
else (acc, el::cur_fold_acc, cur_num + 1)
) (base, [], 1) lst in (acc, remainder)
这有点工作;但是,这样做的问题是在函数中使用这些元素并不容易。
我首选的实现会以某种方式使用元组或数组来使元素访问更容易。
这是一个更好的输入/输出示例(使用utop
语法)。在这种情况下,我总结了每一对元素。
# fold_left_multiple (fun lst (e1, e2, e3) -> (e1 + e2 + e3)::lst) [] [1; 2; 3; 4; 5; 6; 7; 8] 3;;
- : int list * int list = ([15; 6], [7; 8])
在这里,如果列表的长度不能被整除,则剩余的元素将n
被放入元组的第二个元素中。
(我不介意这个余数是否在解决方案中反转。)