Дополнение между опцией int и int - PullRequest
2 голосов
/ 25 марта 2019

У меня есть целочисленная матрица из n строк по m столбцов, представляющих игровое поле, и я написал две функции, которые позволяют мне получать и устанавливать значения в матрице.

let get_val board (row, col) = 
  if row < 0 
    || col < 0 
    || (Array.length data) < (row + 1) 
    || (Array.length data.(row)) < (col + 1)
      then None
  else if (board.(row).(col)) = (-1)
    then None
  else Some (board.(row).(col)) ;;

let set_val board (row, col) i = 
  if row < 0 
    || col < 0 
    || (Array.length data) < row+1
    || (Array.length data.(row)) < col+1
    || i < 0
      then invalid_arg "set: invalid arguments"
  else board.(row).(col) <- i;
       board ;;

let board = Array.make_matrix 4 4 ;;

Все позиции изначально установлены на -1, чтобы представить пустой квадрат. По сути, если я пытаюсь получить значение за пределами доски, я получаю None. Если местоположение является допустимым, а не пустым квадратом, я могу получить значение в этой матрице как некоторый тип. Я хотел бы увеличить позицию на 1 на доске, используя эти две функции.

Моя первая попытка на доске 1, сделав следующее:

let board = set_val board (2, 2) ((get_val board (2, 2)) + 1)

Однако я сталкиваюсь с проблемой типа

This expression has type int option but an expression was expected of type int 

, что я понимаю, потому что "get_val" возвращает тип Some, а 1 - целое число. Я также попробовал:

let board = set_val board (2, 2) ((get_val board (2, 2)) + (Some 1))

, но доска - это целочисленная матрица. Ограничения проблемы требуют, чтобы я возвращал Some / None из «get_val», но мне нужен способ извлечь значения из функции «get» как int, а не Some. Я изучил, как преобразовать Option из int в int, но ничего не нашел, поскольку у меня нет доступа к модулю Option. Я подозреваю, что я не ищу правильную вещь, но исчерпал места, чтобы искать. Как бы я мог использовать результат "get_val" таким образом, чтобы я мог увеличивать новое значение для позиции на доске?

1 Ответ

1 голос
/ 25 марта 2019

Лучший / идиоматический способ Ocaml - это сопоставление с образцом.

let board = match (S.get grid (row, col)) with 
    | None -> S.set grid (row, col) 1
    | Some v -> S.set grid (row, col) (v+1)

Очевидно, что таким образом вы можете лишить Some часть v и просто получить фактическое значение.

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