Сдвиг массива влево или вправо OCaml - PullRequest
0 голосов
/ 08 мая 2020

У меня проблемы с массивами в OCaml. А именно, я хочу просто сдвинуть элементы вправо или влево в зависимости от передаваемого значения. Пример: # let a = [|1;2;3;4;5|], # shift_array a 7;;- : int array array = [|4;5;1;2;3|]

Я написал следующий код, но продолжаю получать синтаксическую ошибку, когда сформирован второй массив.

let shift_array arr x =
  let size = Array.length arr in
  let sec_arr = Array.make size 0 in
  for i = 0 to size - 1 do
    if i < x
    then (sec_arr.(size - x + 1) <- arr.(i))
    else (sec_arr.(i-x) <- arr.(i))
  done;;

Я просто не уверен на 100%, как печатать из нового массива.

РЕДАКТИРОВАТЬ: исправлено, добавив in во вторую и третью строку.

Теперь проблема в том, что функция имеет тип int array -> int -> unit и I ' м пытается получить 'a array -> int -> 'a array. Есть ли способ обойти это?

1 Ответ

1 голос
/ 09 мая 2020

Это должно быть let size = Array.length arr in, обратите внимание на in, которого вам не хватает.

Выражение let в OCaml имеет форму let <var> = <expr> in <body>, и его не следует (но обычно) путать с определением let , которое может встречаться только на верхнем уровне (как элемент модуля), который имеет форму let <name> = <body>.

В вашем примере у вас есть как определение верхнего уровня, let shift_array = <body>, так и два выражения let (хотя вы использовали неправильный синтаксис для них.

РЕДАКТИРОВАТЬ:

Поскольку OP редактировал сообщение, вот соответствующее изменение.

Ваша функция ничего не возвращает, она создает новый массив, делает цикл, но не возвращает ничего, кроме значения unit (которое является значением, которое оценивает цикл for). Таким образом, вам нужно добавить еще одну строку, которая будет содержать выражение, для которого вся функция будет оценивать . Подсказка: оператор последовательности ; - это то, что вам нужно, когда у вас есть выражение x;y;z, компьютер оценивает x, затем y и, наконец, z, а значение всего выражения x;y;z является значение z.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...