当给出的列表不为空时,F#与空列表匹配

cod*_*lyf 1 f# pattern-matching

我试图找到一个矩阵的转置,我知道我的代码到目前为止是不正确的但是我更关心的是为什么当我用transpose测试它时[[4;3];[1;5];[6;7]]它会进入第一个匹配的情况,这是一个空列表?

let rec transpose = function
     | [] -> failwith "Error, no matrix supplied"
     | [[]] -> []
     | [[x]] -> [[x]]
     | x::xs -> let temp = List.head x :: (List.map (fun n -> List.headn) xs)    
                temp :: transpose(xs);;
Run Code Online (Sandbox Code Playgroud)

N_A*_*N_A 5

案例2:

[[]]
Run Code Online (Sandbox Code Playgroud)

将匹配包含空列表的列表.

案例3:

[[x]]
Run Code Online (Sandbox Code Playgroud)

将匹配包含包含单个项目的列表的列表.

这个案例:

x::xs
Run Code Online (Sandbox Code Playgroud)

进行一些处理上x,然后递归的xs,所以调用transpose[[4;3];[1;5];[6;7]]会导致递归调用transpose以下参数:

[[4;3];[1;5];[6;7]]
[[1;5];[6;7]]
[[6;7]]
[]
Run Code Online (Sandbox Code Playgroud)

您可以看到这些值都不匹配案例2或案例3,并且最终值与案例1匹配,因此递归最终将终止于案例1.