在 Ocaml 上匹配矩阵中的字符

Matching a char in a matrix on Ocaml

我正在制作游戏解算器,在 OCaml 中使用矩阵时,我需要检查它何时完成,使用 A 或 V,为此我尝试查看是否有“.”。在至少一个单元格中,因为它象征着一个空单元格。代码如下:

let is_solved m n =
  for i=0 to n do
    for j=0 to n do
      if(m.(i).(j)='.') then false
    done
  done;;

所以我的 is_solved 函数在找到 '.' 时必须 return false在任何位置,如果没有则为真。但是 OCaml 给了我一个:

Error: The variant type unit has no constructor false

我是 OCaml 的新手,但有人可以告诉我我需要修复什么,甚至为什么它会给我错误消息吗?

首先,请注意 for ... done 形式的任何 OCaml 构造的值都是 (),类型为 unit 的单个值。你不能像你试图做的那样给循环赋值。

你的直接问题是,当你在 OCaml 中使用 if 而没有 else 时,表达式的值必须是 unit 类型。这是必要的,因为两种情况下的类型必须相同。但是,由于上述问题,这真的不值得修复。

如果您想使用 for 循环来解决您的问题,您需要使用命令式方法。也就是说,你需要保留一个可变值来保存你想要的内容 return 最后。

(由于您是 OCaml 的新手,尝试以更实用的风格编写此函数可能会很有用,只是为了看看它的外观。)

您可以按照 Jeffrey 的建议以递归方式编写此函数,只是为了给您一个开始,我将提供一个通用模板让您填补空白:

let todo = failwith

(* [is_solved field m n] true if exists '.' in the [field], where
   [field] is a matrix of size [m] x [n] *)
let is_solved field m n = 
  let rec outer = function 
    | 0 -> todo "outer loop ends" 
    | m -> inner m n 
  and inner m = function
    | 0 -> todo "inner loop ends"
    | n -> todo "inner loop workload" in
  outer m