2014-10-30 23 views
2

假設我有一個(int list list) x = [[1;1;1]; [2;2;2]; [3;4;5]]和函數f。結果應該是[f [1;1;1]; f [2;2;2]; f[3;4;5]].內置的List.map只適用於int列表,但不適用於int list列表。這個新列中的第i個條目由函數f計算,該函數將輸入每個元素的第i個元素電子表格中的列並形成一個新元素。如何使用List.map在int列表中應用函數?

let newList x f = List.map f x(*這是唯一的地圖功能,我知道*)

回答

1

您可以使用List.map f作爲一個功能,即在一名維列表的作品,然後map的二維列表上的功能如下:

let x = [[1;1;1]; [2;2;2]; [3;4;5]];; 
let f x = x + 1;; 
List.map (List.map f) x;; 

輸出:

- : int list list = [[2; 2; 2]; [3; 3; 3]; [4; 5; 6]] 

我的函數將作爲輸入兩個參數,一個int列表列表和一個函數f。它會輸出一個新的int列表。輸入= m = [[x1; x2; x3]; [y1; y2; y3]; [z1; z2; z3]]和函數f Output = [f [x1; y1; z1]; f [x2; y2; z2]; F [×3,Y3,Z3]

看來你想調換(https://stackoverflow.com/a/3989823/4196578)的2-d數組,然後映射f。在這種情況下,你可以這樣做:

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

let myfunc m f = List.map f (transpose m);; 
+0

謝謝你的幫助。我怎樣才能創建一個新列,其中新列的第i個元素將成爲在初始int列表中的所有列的所有第i個元素上調用f時的結果。例如。對於新列的第三個元素,我們在[1; 2; 5]上調用函數f。所以新列的完整結果是[f [1; 2; 3]; f [1; 2; 4]; F [1; 2; 5]]。 – user1836292 2014-10-30 05:24:28

+0

我不確定你的意思。 f'的確切定義是什麼?在你原來的問題f是':int - > int',現在'f'是一個不同的類型? – thor 2014-10-30 15:18:44

+0

假設我給了一個int列表列表m = [[x1; x2; x3]; [y1; y2; y3]; [Z1; Z2; Z3]。我如何創建一個新的int列表m'= [[x1; y1; z1]; [x2; y2; z2]; [x3; y3; z3]],然後使用List.map應用函數f以得到結果= [f [x1; y1; z1]; f [x2; y2; z2]; f [x3; y3; z3]]? – user1836292 2014-10-30 15:20:31