2015-04-13 3 views
-2
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) 

Я нашел этот код на этом сайте и переставляет список списка или в моем случае матрицу из п × м т × n.The Единственная проблема, я понятия не имею, как она работает. Может кто-нибудь объяснить это шаг за шагом, по строкам.Tranpose список список в OCaml

+1

Это не то, для чего предназначен этот сайт, но вы можете получить множество учебных ресурсов из https://ocaml.org/learn/ –

ответ

2

Вы должны указать ссылку на код, а также контекст или посмотреть на этот вопрос для объяснения.

В любом случае, я подозреваю, что другие новые программисты OCaml придут к этому вопросу в поисках ответа.

- После быстрого поиска Google я считаю, что это был номер question, на котором вы нашли код.

let rec transpose list = match list with

  • Создайте функцию под названием транспонирования, сделать его рекурсивным (ЗАП), как мы сделаем вызов функции себя. Он примет входной параметр, называемый list, где тип определяется системой типа OCaml позже.

  • Соответствует входному параметру list со следующими случаями. То есть, когда функция находит шаблон, соответствующий этим случаям, он выполнит эту конкретную строку кода. Если написанный код не распространяется на все случаи, OCaml уведомит, что не все случаи являются исчерпывающими и вызывают match_failure, если он сталкивается с случаями, которые он не охватывает.

Первый случай:

| [] -> []

  • Если мы попали в пустой список, возвращает пустой список. Это закончит рекурсию, так как пустой список добавляется к окончательному результату и возвращается. Пустой список - это базовый регистр, в котором мы встречаем список, в котором ничего нет, или он повторился, пока ничего не осталось. (Транспонированная пустого списка ... и пустой список)

| [] :: xss -> transpose xss

  • Это тот случай, когда есть еще элементы в списке. Поскольку это список списка, каждый элемент в списке, который мы передаем, является другим списком. то есть [[1;2];[3;4]], поэтому эта функция обрабатывает случай, когда у нас есть [[];[1;2];[5;6]], он пропустит пустой внутренний список, а затем вызовет транспонирование на другом [[1;2];[5;6]], так как нам не нужно транспонировать пустой список. Обратите внимание: xss - это остальная часть списка (следовательно, список списка), а не только следующий элемент (который является только списком).

| (x::xs) :: xss -> (x :: List.map List.hd xss) :: transpose (xs :: List.map List.tl xss)

  • Это первый случай, который будет соответствовать, когда мы переходим в любом регулярном списке списка длины> 1, OCaml может соответствовать, а также «разворачивать» каждый элемент, сломав его, чтобы соответствовать шаблону, поэтому мы можем сразу вычислить эти элементы без использования вложенных операторов match. В этом случае мы разделим список списка на список (x::xs) (первый элемент) и оставшийся список списка, xss.Мы могли бы также сделать это как x::xss, но x будет списком, который нам нужно разбить на отдельные элементы. Например, в [[1;2];[3;4]], (х :: хз) будет [1, 2] и xss будет [[3, 4]]

  • (x :: List.map List.hd xss) примет первый элемент в первом списке, в данном Например, x будет равно 1. И примените это значение к List.hd каждого элемента в списке xss, (List.Map применяет функцию к каждому значению в списке).

  • Это то место, где это кажется немного сложным. Как вы можете смотреть на это: когда вы вызываете List.hd [1;2;3], он вернется 1, так как это голова. Поэтому, когда мы делаем 3 :: List.map List.hd [[1;2]], он вернется int list = [3; 1]. и мы сделали 3 :: List.map List.hd [[1;2];[4;5]], мы получаем [3;1;4], поскольку мы получаем заголовок каждого списка внутри большего списка и добавляем 3 в начале результирующего списка.
  • Если вы сделали List.map List.tl [[1;2];[4;5]], вместо этого ваш тип возврата будет [2; 5], поскольку List.map применяет функцию List.tl к каждому списку. Вы можете использовать List.map, чтобы применить функцию умножения (или что-то сложное) к каждому элементу в списке быстрым и легким способом.

Оставшийся transpose (xs :: List.map List.tl xss) просто вызывает транспонированная к остальным элементам списка, который значения хвоста xss (все списки), добавляемые с элементами хз. Попробуйте это на бумаге, если вы чувствуете, что вам нужно более конкретное понимание.

Смежные вопросы