Syntax 当我不';不要使用双分号

Syntax 当我不';不要使用双分号,syntax,ocaml,Syntax,Ocaml,我试图进入OCaml,但在编译代码时遇到了问题 let area_of_ring inner_radius outer_radius = let pi = acos (-1.) in let area_of_circle r = pi *. r *. r in area_of_circle outer_radius -. area_of_circle inner_radius Printf.printf "Area of ring: %f\n" (area_of_rin

我试图进入OCaml,但在编译代码时遇到了问题

let area_of_ring inner_radius outer_radius =
    let pi = acos (-1.) in
    let area_of_circle r = pi *. r *. r in
    area_of_circle outer_radius -. area_of_circle inner_radius

Printf.printf "Area of ring: %f\n" (area_of_ring 1. 3.)
试图用
ocamlc-o all.ml
编译该代码时出现以下错误:

File "all.ml", line 4, characters 35-49:
Error: This function has type float -> float
   It is applied to too many arguments; maybe you forgot a `;'.
但是,如果我在顶层键入它或添加两个分号,代码就可以正常运行

# let area_of_ring inner_radius outer_radius =
      let pi = acos (-1.) in
      let area_of_circle r = pi *. r *. r in
      area_of_circle outer_radius -. area_of_circle inner_radius;;
val area_of_ring : float -> float -> float = <fun>

# Printf.printf "Area of ring: %f\n" (area_of_ring 1. 3.);;
Area of ring: 25.132741
- : unit = ()
#让"环的面积"内"半径"外"半径=
设pi=acos(-1.)in
设_圆的面积r=pi*。r*。加入
圆外半径的面积-。圆内半径的面积;;
环的val区域:浮动->浮动->浮动=
#Printf.Printf“环的面积:%f\n”(环的面积1.3);;
圆环面积:25.132741
-:单位=()

有人能解释一下发生了什么事吗?这并不重要,但我希望能够在编写程序时处处不使用双分号。

如果没有这两个分号,则有几个表达式彼此相邻。第一个是在函数
area\u of_ring
中调用
area\u of_circle
,第二个是
内半径
,第三个是
Printf.Printf
,依此类推。由于编译器试图解释的原因,这没有意义

与许多语言一样,空格和换行符对OCaml语法没有意义。因此编译器将其视为一个大表达式

编写顶级表达式(如
Printf.Printf
)的一个好习惯用法如下:

let () = Printf.printf "Area of ring: %f\n" (area_of_ring 1. 3.)

(这就是我编写代码的方式。)

哦,如果没有说明打印行是一个新的表达式,或者类似的东西,编译器试图将其读入area of ring函数的下一行?太好了!这很有道理。第一次接触函数式语言,所以有点难以习惯非命令式的规则和语法。