我有一个非常简单的问题,如何对列表列表中的每个列表执行加法运算-包含整数。
因此,如果我这样调用此函数:
add [[1;5] ; [4;3;7]];;
...它应该返回此:
-: int list = [6;14]
我想到了这段代码,但是它不能正常工作...
let rec add list = match list with
| [] -> []
| hd::tl -> (List.map(fun x -> x + List.hd) hd)::add(tl);;
但是,这是这样做的:
let rec add list =
if (list = []) then []
else (List.map(fun x -> x+x) (List.hd list))::add(List.tl list);;
add [[1;3];[5;7]];;
...但是它只对列表中的单个整数执行加法运算,是相同的整数,是的,我知道为什么;因为我已经说过:fun x-> x + x ...但不应该使用map函数还计算togheter列表中的整数?我的意思是说,因为我已经用:: add(tl list)以尾递归的方式使用了它顺便说一句,即使我使用模式匹配,也无法正常工作...
总而言之,我要求该函数给我这个输出:
-: int list = [6;14]
...,输入为:加[[1; 5]; [4; 3; 7]] ;;
有人可以帮忙吗?我将非常感谢!
容器上有两个基本操作:折叠(也称为缩小)和映射。折叠操作获取列表并将一些操作应用于其连续元素。映射操作将对所有元素应用相同的操作来重建列表。
fold vs. map
x x x x x x x x x x x x x x
| | | |
\ / \ /
y y y y y y y y
对于您的任务,我们可以将这些操作一起应用,即折叠内部列表并映射外部列表,这可以在OCaml中非常简洁地表达:
let sums = List.map (List.fold_left (+) 0)
作为练习,我建议在不使用List模块的标准操作的情况下实现相同的功能。