我有以下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函数,但不确定要传递给哪个函数,以便获得这些结果。
感谢您的帮助
答案 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 = []