当我不使用双分号时,ocamlc失败

时间:2017-10-25 15:17:04

标签: 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_ring 1. 3.)

尝试使用ocamlc -o all 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 = ()

有人可以解释发生了什么吗?这并不重要,但我希望能够在没有双分号的情况下编写我的程序。

1 个答案:

答案 0 :(得分:5)

如果没有两个分号,则表示彼此相邻的几个表达式。第一个是函数area_of_circlearea_of_ring的调用,第二个是inner_radius,第三个是Printf.printf,依此类推。由于编译器试图解释的原因,这没有意义。

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

编写像Printf.printf这样的顶级表达式的好习惯是这样的:

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

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