我的教授给出了这个功能,我不知道实际发生了什么。
这是计算m-by-n矩阵转置的函数:
let rec transpose = function
| [] -> failwith "cannot transpose a 0-by-n matrix"
| []::xs -> []
| xs -> List.map List.head xs :: transpose (List.map List.tail xs)
测试功能:
> transpose [[1;2;3];[4;5;6]];;
val it : int list list = [[1; 4]; [2; 5]; [3; 6]]
我理解List.map,递归和所有这些东西。我只是不明白为什么/这个功能如何工作。任何澄清将非常感谢!谢谢!
答案 0 :(得分:5)
假设我们有一个3x3矩阵A
。
let A =
[ [1;2;3]
[4;5;6]
[7;8;9] ]
= [ R1 R2 R3 ]
现在,让我们分析转置函数。
let rec transpose = function
| [] -> failwith "cannot transpose a 0-by-n matrix"
| []::xs -> []
| xs -> List.map List.head xs :: transpose (List.map List.tail xs)
前两个案例抓住了以下事件:
代码[1]
List.map List.head xs
将内部列表映射到各自的头元素
R1.Head ; R2.Head ; R3.Head = 1 ; 4 ; 7 = C1
代码[2]
transpose (List.map List.tail xs)
(recursivly)转置斩首列表的尾部。
因此,在每次递归时,列都会转换为一行。
然后使用::
关键字将这些行用于构造结果列表。
transpose A = C1 :: C2 :: C3 :: [] = [ C1 C2 C3 ] = [ [1;4;7] [2;5;8] [3;6;9] ]