int选项和int之间的加法

时间:2019-03-25 02:23:37

标签: ocaml

我有一个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”的结果?

1 个答案:

答案 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}}部分,并获得实际值。