我试图教我OCaml的。 我已经在这一个语法陷阱将坚果。 有人告诉我,你可以字符串表达式一起按顺序使用“;” 也就是说,表达式1; 表达式2执行第一EXPR,则第二,如所预期。 出于某种原因,我无法解释有以下输入同意
let x = 5 ; let y = 7;;
奇怪的是,如果只有第一expr是一让,它的工作原理。 所以
let x = 5 ; 7;;
通行证,并评估为7更糟的是,如果我尝试使用括号组成的语句的多个序列,其中让利至上,它仍然无法正常工作。 IE:
let x = 5 ; (let y = 7 ; 9);;
是错误的,即使它是由只有在让是第一个表达序列。 有人能解释如何得到这个工作?
看问题的一种方法是, let x = 5
不是表达式。 这是一个顶级声明; 即,它声明的名称x
有一个值5。
的;
操作适用于组合表达式,而不是声明。
你并不需要串声明连同;
。 你可以把一个接一个:
# let x = 5 let y = 7;;
val x : int = 5
val y : int = 7
#
有一个完全不同的使用的let
在OCaml中是表达式的一部分。 在这种情况下,它随后in
:
# (let x = 4 in x + 1);;
- : int = 5
由于这是一种表达,你可以将若干个他们一起;
:
# (let x = 4 in x + 1); (let y = 6 in y + 1);;
Warning 10: this expression should have type unit.
- : int = 7
然而,由于编译器警告你,这不是成语串起来任意表达式。 通常情况下,你使用;
有必要的代码。 随着功能的代码,它没有任何意义。 所以编译器期望所有,但最后一个表达式有型unit
(这是用于必要的代码,做一些有用的东西,但不会返回一个有用的值)。