从二维列表中提取元素

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

我有以下二维列表

[ [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 函数,但我不确定要传递给它什么函数,以便我可以获得这些结果。

如有任何帮助,我们将不胜感激

arrays list pattern-matching ocaml
2个回答
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 = []

0
投票

我不确定是否理解这个问题。

但是,正如我从您的示例中看到的,我会转置您的列表列表(请参阅列表列表的转置

示例:

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]] 
© www.soinside.com 2019 - 2024. All rights reserved.