以下 OCaml 片段中的错误是什么?

What is the error in the following OCaml Snippet?

代码: let ab = let a = 'a' in let b = 'B' in (Char.lowercase b) in a :: [b];;

我正在学习 let 关键字。我希望表达式计算出字符列表 ['a', 'b'] 但我一直收到错误

Error: Unbound value a

我不知道为什么会这样。据我所知,我可以继续在 let 中使用 let 来创建新的绑定,并且我在开始时使用 leta 绑定到 'a'本身,因此它在内部范围内也应该有一个有效值,对吗?

我知道我可以简单地做 b = 'b' 而不是 b = 'B' in (Char.lowercase b) 但我正在试验我能做什么和不能做什么,对我来说这也应该有效。

您的 in 个关键字过多。最上面的 let 不应该有对应的 in.

let ab =
  let a = 'a' in
    let b = 'B' in
      (Char.lowercase b) in
        a :: [b];;

重新写成这样:

let ab =
  let a = 'a' in
    let b = 'B' in
      a :: [Char.lowercase b];;

实际上,由于let b表达式没有引用a,所以可以这样写:

let ab =
  let a = 'a'
  and b = 'B' in
    a :: [Char.lowercase b];;

根据评论中的讨论,我也建议,如果你想要一个表达式:

let ab =
  let a = 'a' in
  let b = 'B' in
  a::[Char.lowercase b]
in
(* The rest of your code. *)

问题是你的表情是这样的:

let ab =
  let a = 'a' in
  let b = 'B' in
  Char.lowercase b   (* Result: ab gets bound to 'b'. *)
in
a :: [b]             (* a and b aren't visible out here! *)

我也建议采用类似这种风格的缩进,以帮助您清楚地看到这些东西。 OCaml 程序员通常在 let 之前换行。如果 let p = e in e'ee' 不在一行中,请缩进 e,但不要缩进 e'。这样,您可以快速查看 p 的绑定在哪些进一步的表达式中可见,并查看 e 中进行的任何绑定在 e'.

中不可见