Ocaml int选项和int之间的加法
我有一个n行m列的整数矩阵,表示一个游戏板,并且编写了两个函数,允许我在矩阵中检索和设置值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))
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)