Функция написана не особо читабельно, что может быть причиной вашего замешательства.Конструкция (_::_)::_
- это шаблон, соответствующий значению типа список списков целых чисел , который говорит, что первый случай должен выполняться, когда вы получаете непустой список непустых списков.
То же самое можно написать так.Это более многословно, но должно быть понятно, что здесь происходит:
let rec transpose matrix =
match matrix with // matrix is a list<list<int>>
| row::rows -> // case when the list of rows is non-empty
match row with // rows is a list<int>
| col::cols -> // case when the row is non-empty
// Take first elements from all rows of the matrix
let first = List.map List.head matrix
// Take remaining elements from all rows of the matrix
// and then transpose the resulting matrix
let rest = transpose (List.map List.tail matrix)
first :: rest
| _ -> []
| _ -> []
Как видите, нам не нужны значения row
, rows
, col
иcols
.Вот почему оригинальная реализация заменяет их на _
(который игнорирует значение и проверяет только то, что список может быть разложен требуемым образом).
В рекурсивном случае мы деконструируем матрицу следующим образом:
[ [ x; y; y ]; [ y; y ]
[ x; y; y ]; => [ x; x; x] :: transpose [ y; y ]
[ x; y; y ] ] [ y; y ]
Надеюсь, что картинка прояснит для вас!