简单 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 语法错误的主要内容,如果未能解决你的问题,请参考以下文章