如果OCaml中的语句为false,则语句将尽早结束

时间:2014-03-26 16:34:43

标签: ocaml

假设已定义pos_of_xy(x,y)n以返回int,则一旦if语句之一返回false,此代码段将退出,就好像它们是嵌套的一样。无论先前的if语句如何,我都需要它们全部运行。我不确定我忘了什么。

let final = ref [] in begin
  if x < (size-1) then let pos = pos_of_xy (x+1, y) size in final := pos::!final;
  if y < (size-1) then let pos = pos_of_xy (x, y+1) size in final := pos::!final;
  if y > 0 then let pos = pos_of_xy (x, y-1) size in final := pos::!final;
  if x > 0 then let pos = pos_of_xy (x-1, y) size in final := pos::!final;
end;

2 个答案:

答案 0 :(得分:6)

描述问题的一种方法是let强于ifletin之后接受一系列语句,并且您的后续if被视为此序列的一部分。如果您将每个let括起来,那么事情应该有效:

if x < size - 1 then
    (let pos = pos_of_xy (x + 1, y) size in final := pos :: !final);

或者你没有let

if x < size -1 then final := pos_of_xy (x + 1, y) size :: !final;

作为旁注,如果您使用更具功能性的样式(没有可变值),代码可能看起来更好于FP编程器。

<强>更新

以下是计算清单的更实用方法的快速草图:

let good (x, y) = x >= 0 && x < size && y >= 0 && y < size in
let topos (x, y) = pos_of_xy (x, y) size in
let goodxy =
    List.filter good [(x + 1, y); (x, y + 1); (x - 1, y); (x, y - 1)] in
List.map topos goodxy

答案 1 :(得分:1)

正如Jeffrey Scofield所说,let的优先级低于if。所以就像你写的那样:

let final = ref [] in begin
  if x < (size-1) then (let pos = pos_of_xy (x+1, y) size in (final := pos::!final;
  (if y < (size-1) then (let pos = pos_of_xy (x, y+1) size in (final := pos::!final;
  (if y > 0 then (let pos = pos_of_xy (x, y-1) size in (final := pos::!final;
  (if x > 0 then (let pos = pos_of_xy (x-1, y) size in (final := pos::!final;)))))))))))
end;

您可以查看优先级表here(向上滚动一点)。如您所见,if的优先级高于;,优先级高于let