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

标签 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 = ()

谁能解释一下这是怎么回事?这并不重要,但我希望能够编写我的程序而无处不在双分号。

最佳答案

如果没有这两个分号,您将有几个彼此相邻的表达式。第一个是在函数 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/

相关文章:

ruby - ruby 语法糖的加法

c++ - 如何在类模板之外定义类模板的构造函数模板?

ocaml - Ocaml 有 Bignum 模块吗?

OCaml 的缺点

arrays - OCaml 中的 a.{X} 是什么意思?

javascript - 有没有办法在 CoffeeScript 中向此 JQuery 调用添加另一个函数引用参数,而无需为每个参数使用一行?

perl - 返回长字符串 1 的短阶乘计算器

module - 扩展 OCaml 模块

ocaml - 如何在沙丘中禁用错误​​(警告 66): unused open!

OCaml中具有特定长度的列表的列表