我正在制作一个游戏求解器,并且在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函数在找到'时会返回false。在任何位置,如果没有,则为真。但OCaml给了我一个:
Error: The variant type unit has no constructor false
我是OCaml的新手,但有人可以告诉我需要修复的内容,甚至为什么会给我错误信息?
答案 0 :(得分:1)
首先,请注意for ... done
形式的任何OCaml构造的值为()
,类型为unit
的单个值。您似乎无法为循环赋值。
您当前的问题是,当您在OCaml中使用if
而没有else
时,表达式的值必须是unit
类型。这是必要的,因为在两种情况下类型必须相同。但是,由于上述问题,并不值得解决这个问题。
如果您想使用for
循环来解决问题,则需要使用命令式方法。也就是说,你需要保留一个可变值来保存你想要在结束时返回的内容。
(由于您是OCaml的新手,因此尝试以更具功能性的方式编写此函数以查看其外观可能会很有用。)
答案 1 :(得分:0)
你可以像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