如何计算列表列表中的单个列表

问题描述 投票:0回答:1

我有一个非常简单的问题,如何对列表列表中的每个列表执行加法运算-包含整数。

因此,如果我这样调用此函数:

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]] ;;

有人可以帮忙吗?我将非常感谢!

pattern-matching ocaml tail-recursion
1个回答
0
投票

容器上有两个基本操作:折叠(也称为缩小)和映射。折叠操作获取列表并将一些操作应用于其连续元素。映射操作将对所有元素应用相同的操作来重建列表。

      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模块的标准操作的情况下实现相同的功能。

© www.soinside.com 2019 - 2024. All rights reserved.