如何折叠每张列表的x个元素

问题描述

所以,让我们说我们有一些如下列表:[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整除,则其余元素将放入元组的第二个元素。

(我不介意在解决方案中是否可以逆转此余数。)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)