从二维列表中提取元素

时间:2018-11-13 20:13:52

标签: arrays list pattern-matching ocaml

我有以下2d列表

[ [a1 ; a2 ; a3 ; a4] ;
  [b1 ; b2 ; b3 ; b4] ;
  [c1 ; c2 ; c3 ; c4] ]

,我有一个输入函数F。 我有以下问题:给定2d列表m和函数f,计算第i个值    通过使用m中每列的第i个值,将结果列c赋值。

[ f [a1; b1; c1]; f [a2; b2; c2]; f [a3; b3; c3]; f [a4; b4; c4]; f [a5; b5; c5] ]

如何创建每个子列表的前几个元素的列表?我当时在考虑使用List.map函数,但不确定要传递给哪个函数,以便获得这些结果。

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

我不确定这个问题。

但是,从您的示例中可以看出,我将转置您的列表列表(请参见transpose of a list of lists

示例:

let rec transpose list = match list with
| []             -> []
| []   :: xss    -> transpose xss
| (x::xs) :: xss ->
    (x :: List.map List.hd xss) :: transpose (xs :: List.map List.tl xss);;

//An example of int list list
let m=[ [11 ; 12 ; 13 ; 14] ;
        [21 ; 22 ; 23 ; 24] ;
        [31 ; 32 ; 33 ; 34] ];;

//An example of int list-> int function
let f list = List.fold_right (+) list 0;;

List.map f (transpose m);;

得到[f [11; 21; 31]; f [12; 22; 32]; f [13; 23; 33]; f [14; 24; 34]]

答案 1 :(得分:0)

也许您可以尝试以下方法:

open List;;

let map2d f l =
  let rec aux acc l =
    try (
      let l'=map hd l and
          l =map tl l in
      aux (f l'::acc) l
    ) with _ -> rev acc
  in
  if l=[] then [] else aux [] l
;;

测试

let f = fold_left (+) 0;;
let id x = x;;

let m=[ [11 ; 12 ; 13 ; 14] ;
        [21 ; 22 ; 23 ; 24] ;
        [31 ; 32 ; 33 ; 34] ];; 

# map2d id m;;
- : int list list = [[11; 21; 31]; [12; 22; 32]; [13; 23; 33]; [14; 24; 34]]

# map2d f m;;
- : int list = [63; 66; 69; 72]

# map2d id [[11;21];[12];[13]];;
- : int list list = [[11; 12; 13]]

# map2d id [[];[]];;
- : 'a list list = []
# map2d f [[];[]];;
- : int list = []