我正在尝试进入 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 = ()
谁能解释一下这是怎么回事?这并不重要,但我希望能够编写我的程序而无处不在双分号。
最佳答案
如果没有这两个分号,您将有几个彼此相邻的表达式。第一个是在函数 area_of_ring
中调用 area_of_circle
,第二个是 inner_radius
,第三个是 Printf.printf
等等。这没有意义,原因是编译器试图解释。
与许多语言一样,空格和换行符对 OCaml 语法没有意义。因此编译器将其视为一个大表达式。
编写像 Printf.printf
这样的顶级表达式的一个很好的习惯用法是这样的:
let () = Printf.printf "Area of ring: %f\n" (area_of_ring 1. 3.)
(这就是我写代码的方式。)
关于syntax - 当我不使用双分号时 ocamlc 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46936159/