我正在尝试进入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 = ()
有人可以解释发生了什么吗?这并不重要,但我希望能够在没有双分号的情况下编写我的程序。
答案 0 :(得分:5)
如果没有两个分号,则表示彼此相邻的几个表达式。第一个是函数area_of_circle
中area_of_ring
的调用,第二个是inner_radius
,第三个是Printf.printf
,依此类推。由于编译器试图解释的原因,这没有意义。
与许多语言一样,空格和换行符对OCaml语法没有意义。因此编译器将其视为一个大表达式。
编写像Printf.printf
这样的顶级表达式的好习惯是这样的:
let () = Printf.printf "Area of ring: %f\n" (area_of_ring 1. 3.)
(这就是我编写代码的方式。)