У меня есть целочисленная матрица из 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" таким образом, чтобы я мог увеличивать новое значение для позиции на доске?