代码:
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
来创建新的绑定,我在开始时使用let
将a
绑定到'a'
本身,因此它应该在内部范围内有一个有效的值吗?
我知道我可以简单地b = 'b'
而不是b = 'B' in (Char.lowercase b)
,但我正在尝试我能做什么,不能做什么,对我来说这也应该有效。
答案 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之前断行。如果e
和e'
或e
不适合一行,请缩进e'
,而不是p
。这样,您可以快速查看e
的绑定在哪些其他表达式中可见,并且可以看到e'
中的任何绑定在46MTS007
中都不可见。