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

时间:2016-04-01 18:10:25

标签: functional-programming ocaml

代码: 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),但我正在尝试我能做什么,不能做什么,对我来说这也应该有效。

2 个答案:

答案 0 :(得分:2)

您有太多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];;

答案 1 :(得分:2)

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

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! *)

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

let p = e in e'

我还建议使用与此类似的样式进行缩进,以帮助您清楚地看到这些内容。 OCaml程序员通常在let之前断行。如果ee'e不适合一行,请缩进e',而不是p。这样,您可以快速查看e的绑定在哪些其他表达式中可见,并且可以看到e'中的任何绑定在46MTS007中都不可见。