ocaml - 如果在 OCaml 中为 false,则语句提前结束函数

标签 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;

最佳答案

描述问题的一种方式是 letif 强。 letin 之后接受一系列语句,随后的 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

关于ocaml - 如果在 OCaml 中为 false,则语句提前结束函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22667477/

相关文章:

stream - 将 ocaml 函数转换为流

ocaml - OCaml中的 "int/2"类型是什么

ocaml - Opa 的基于图形的数据库是否单独提供?

list - 如何更改记录中的部分值?

ocaml - 二进制文件如何嵌入并在字节码可执行文件和 ocamlrun 之间分离?

OCaml 坚持函数不是多态的,但不指定类型

ocaml - 在不炸毁堆栈的情况下生成素数

ocaml - 如何在 OCaml 中使用断言?

pattern-matching - 使用 GADT 建模语法,但类型参数无法统一

module - 扩展递归模块