简单 if-then-else 中的 Ocaml 语法错误

Posted

技术标签:

【中文标题】简单 if-then-else 中的 Ocaml 语法错误【英文标题】:Ocaml syntax error in a simple if-then-else 【发布时间】:2017-07-15 13:13:57 【问题描述】:

我想把一些用 C 写的代码改成 Ocaml

这是一个 C 代码

int a, b;
if(m > n)

    a = n;
    b = m;

else

    a = m;
    b = n;

我尝试将其更改为 Ocaml,但不知何故在第二行出现语法错误。

let rec gcd m n =
 if m > n then begin let a = n in; let b = m in end
 else begin let a = m in; let b = n in end

问题是什么,我该如何解决?

【问题讨论】:

问题出在let a = n in;,而不是if 【参考方案1】:

如果你不想,你也可以这样做:

let m=3 and n=4 in

let a=ref 0 and b=ref 0 in
if(m > n)
then
(
    a:=n;
    b:=m;
)
else
(
    a:=m;
    b:=n;
);

Printf.printf "a=%d b=%d\n" !a !b;;

【讨论】:

【参考方案2】:

您必须了解 let 声明是本地的。也就是写let variable = assignment in expression时,variable只绑定在expression的范围内

现在当您编写begin let a = n in; let b = m in end 时,不仅您的变量不会被绑定到块之外,而且编译器仍在等待in 两个单词之后的表达式。您必须记住,除非您使用 OCaml 的命令式功能,否则您不应该编写 ; 来指示后续计算。

还要注意,每个let 声明都会创建一个新变量,因此如果您在代码的两个不同位置键入let a=这不一样。因此,let 必须在您的 if 语句的外部

let (a,b) =
 if m > n
 then (n,m)
 else (m,n)
in
the rest of your code

【讨论】:

“除非你使用 OCaml 的命令式特性,否则你永远不应该写 ;。”列表文字和记录除外。 :-) @sepp2k 确实:-)

以上是关于简单 if-then-else 中的 Ocaml 语法错误的主要内容,如果未能解决你的问题,请参考以下文章

初始化变量OCaml

如何从 OCaml 中的字符串中去除空格?

if-then-else 结构中的注释应该放在哪里? [关闭]

使用 If-Then-Else 逻辑进行分支

Angularjs if-then-else表达式中的构造

Angularjs if-then-else 表达式中的构造