gpt4 book ai didi

C 到 OCaml - for 循环内的 If 条件 OCaml

转载 作者:行者123 更新时间:2023-11-30 18:27:45 24 4
gpt4 key购买 nike

我正在尝试将 C 代码重写为 OCaml。但是,我不确定如何在 OCaml 中的 for 循环内使用多个 if 条件。你能帮我弄清楚该怎么做吗?我有 C 代码和我在 OCaml 中所做的事情,但不起作用。

C 代码:

bool function1 (int x, int y, int movei, int sol[][], int xMove[], int yMove[], int n) 
{
int i, next_x, next_y;
if (movei == n)
return true;

for (i = 0; i < n; i++) {
next_x = x + xMove[i];
next_y = y + yMove[i];

if (function2(next_x, next_y, sol)) {
sol[next_x][next_y] = movei;

if (function1(next_x, next_y, movei + 1, sol, xMove, yMove, n))
return true;
else
sol[next_x][next_y] = 0;
}
}

return false;
}
<小时/>

编辑: OCaml 代码

我已经根据 glennsl 答案更改了我的 OCaml 代码,但编译器提示“(”和“)”不匹配且符合预期。

let rec function1 x y movei sol xMove yMove n =
if movei=n then true
else
(
for i=0 to n-1 do
(
let next_x = x + xMove.(i) in
let next_y = y + yMove.(i) in

if (function2 next_x next_y sol) then
sol.(next_x).(next_y)<-movei in
(
if (function1 next_x next_y movei+1 sol xMove yMove n) then true
else sol.(next_x).(next_y)<-0
)
else false

done;; )
)

以前的 OCaml 代码:

let rec function1 x y movei sol xMove yMove n =
if movei=n then true
else
for i=0 to n-1 do
let next_x = x + xMove.(i);
let next_y = y + yMove.(i);

if (function2 next_x next_y sol) then
sol.(next_x).(next_y)<-movei;

if (function1 next_x next_y movei+1 sol xMove yMove n) then true
else sol.(next_x).(next_y)<-0

else ()

done;;

编译器在 OCaml 代码的最后一行显示“语法错误”,即 done;; 所在的位置。

最佳答案

您的代码存在几个问题:

  1. 您遇到的语法错误是由第一个 else 引起的被解释为属于第一个if ,留下第二个else悬空的。 OCaml 对缩进不敏感,因此您需要用括号或 begin 包围嵌套控制结构。和end ,与括号完全相同,但在分隔代码块时看起来更好。使用 ocp-indent 是个好主意以解释代码的方式自动缩进代码,这具有揭示此类错误的良好副作用。

  2. let x = y仅是顶级声明,分号不是语句终止符,而是链接表达式并丢弃第一个结果的运算符。 OCaml 是一种基于表达式的语言,虽然它支持命令式编程,但它没有语句。您想使用的是 let x = y in z ,它绑定(bind)评估 y 的结果名字x在表达式 z 中。只需替换let后面的分号即可与in ,然后就可以了。

  3. 你的if的分支-表达式返回不同的值。最回unit ,但其中两个返回 bool ,这是一个类型错误,因为函数或任何其他表达式不能同时返回 unitbool 。从 C 代码来看,您应该返回 false无论您现在返回何处 () 、隐式(如果表达式计算结果为 () )或显式。

  4. OCaml 也不使用空格进行分组,因此 function1 next_x next_y movei+1 sol xMove yMove n不会被解释为您期望的那样,而是解释为 (function1 next_x next_y movei) + (1 sol xMove yMove n)由于函数应用的优先级高于 +运算符(operator)。环绕move+1放在括号中,使其成为 function1 的单个参数.

关于C 到 OCaml - for 循环内的 If 条件 OCaml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52915509/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com