我有以下二维列表
[ [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 函数,但我不确定要传递给它什么函数,以便我可以获得这些结果。
如有任何帮助,我们将不胜感激
也许你可以试试这个:
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 = []
我不确定是否理解这个问题。
但是,正如我从您的示例中看到的,我会转置您的列表列表(请参阅列表列表的转置)
示例:
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]]