Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ocaml int选项和int之间的加法_Ocaml - Fatal编程技术网

Ocaml int选项和int之间的加法

Ocaml int选项和int之间的加法,ocaml,Ocaml,我有一个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))

我有一个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 ;;
但是,我遇到了类型问题

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,但我需要一种方法,以int而不是Some的形式从函数“get”检索值。我已经研究了如何从一个选项转换成一个int,但是什么也没有想到,因为我不允许访问选项模块。我怀疑我没有找到正确的东西,但是已经找不到地方了。如何使用“get_val”的结果来增加董事会上某个职位的新值?

最好的/惯用的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)

显然,通过这种方式,您可以剥离
v
部分
并只获取实际值。

将int选项存储在电路板中,而不是将
-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)