Существует функция Матрица транспонирования:
let rec transpose = function
| (_::_)::_ as M -> List.map List.head M :: transpose (List.map List.tail M)
| _ -> []
[[1; 2; 3]; [4; 5; 6]; [7; 8; 9]] |> transpose |> printfn "%A"
Он отлично работает.
Что означает (_:: _):: _?
Я не понимаю весь код!
Кто может это объяснить?
Спасибо!
Я нахожу ответ:
(_:: _):: _ - это сопоставление шаблонов по значению типа списка списков ints
Если я пишу:
let rec transpose (M:int list list) =
match M with
| hd::tl -> List.map List.head M :: transpose (List.map List.tail M)
| _ -> []
Он выдает исключение во время выполнения. Что-то не так с hd?
Да, он делает что-то вроде [[], []; []] при вызове List.tail, затем он выдает исключение при вызове List.head!
Проблема решена!
Спасибо всем!