我有一个n行乘m cols的整数矩阵,代表一个游戏板,并且编写了两个函数,使我可以在矩阵内检索和设置值。
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,以表示一个空正方形。基本上,如果我尝试在板子外部检索值,则会得到“无”。如果该位置有效,并且不是一个空的正方形,则可以将该矩阵中的值检索为Some类型。我想通过使用这两个功能在板上增加一个位置。
我通过以下操作第一次尝试登上董事会:
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))
,但是board是一个整数矩阵。问题的约束要求我从“ get_val”返回“ Some / None”,但是我需要一种从函数“ get”中将值作为int而不是Some进行检索的方法。我研究了如何将Option从int转换为int,但由于没有获得对Option模块的访问权限,因此一无所获。我怀疑我没有在查找正确的东西,但是已经用光了很多地方。如何以一种可以在板上增加新值的方式使用“ get_val”的结果?
答案 0 :(得分:1)
做到这一点的最佳/惯用方式是使用模式匹配。
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
的{{1}}部分,并获得实际值。