Global variables Ocaml-全局变量与局部变量

Global variables Ocaml-全局变量与局部变量,global-variables,ocaml,local-variables,Global Variables,Ocaml,Local Variables,我想创建一个名为result的全局变量,它使用5个字符串连接来创建一个字符串,该字符串包含字符串开始的9倍,以逗号分隔。 我有两段代码,只有第二段声明了一个全局变量。 由于某些原因,它不容易在我的大脑中注册。。。只是因为我使用了一个let,所以第一段代码中的结果是一个局部变量吗?对此有更详细的解释吗 let start = "ab";; let result = start ^ "," in let result = result ^ result in let result = re

我想创建一个名为result的全局变量,它使用5个字符串连接来创建一个字符串,该字符串包含字符串开始的9倍,以逗号分隔。 我有两段代码,只有第二段声明了一个全局变量。 由于某些原因,它不容易在我的大脑中注册。。。只是因为我使用了一个let,所以第一段代码中的结果是一个局部变量吗?对此有更详细的解释吗

let start = "ab";;

let result = start ^ "," in
  let result = result ^ result in
  let result = result ^ result in
  let result = result ^ result in
  let result = result ^ start in 
  result;;
- : string = "ab,ab,ab,ab,ab,ab,ab,ab,ab"

let result = 
  let result = start ^ "," in
  let result = result ^ result in
  let result = result ^ result in
  let result = result ^ result in
  let result = result ^ start in 
  result;;
val result : string = "ab,ab,ab,ab,ab,ab,ab,ab,ab"
只是因为我使用了一个
let-in
,所以第一段代码的结果是一个局部变量吗


差不多。定义全局变量的语法是
let variable=expression
,在
中没有
。定义局部变量的语法是
let variable=expression in expression
,当您有
let时,它将在
in
中的
之后定义表达式的
变量
局部。。。在
中,您正在声明一个局部变量。当您仅拥有
let
(在模块的顶层)时,您正在声明模块的全局名称。(即,可以从模块导出的名称。)

您的第一个示例完全由
let。。。在
中。因此没有声明顶级名称


您的第二个示例本身有一个
let
,后面有几个
let。。。在
中。所以它声明了一个顶级名称
result

让我成为一个有点无聊的人。OCaml中没有局部和全局变量。这个概念来自于具有不同范围规则的语言。此外,应注意“变量”一词本身。它的意思被类似C的语言歪曲了。这个词的原始数学含义对应于某个数学对象的名称,该名称在公式中使用,表示一系列此类值。在类C语言中,变量与内存单元混淆,内存单元可以随时间变化。因此,为了避免混淆,让我们使用更准确的术语。让我们使用单词name而不是variable。因为,变量。。。抱歉,名称不是存储单元,没有要创建的内容。当您使用
let
语法之一时,实际上是在创建绑定,即名称和值之间的关联。
let=in
表达式的范围内绑定的值。
let=in
本身也是一个表达式,因此,例如
也可以包含
let。。。在…
内部构造中,例如

 let a = 1 in
   let b = a + 1 in
     let c = b + 1 in 
       a + b + c
我特别以非惯用的方式缩进代码,以突出表达式的语法结构。OCaml还允许使用已绑定到范围中的名称。新绑定将隐藏现有绑定(例如,在C中不允许),例如

最后,顶级(又称模块级)let绑定(用OCaml术语称为定义)的语法是:
let=
,注意这里没有
。定义将
绑定到从定义点延伸到封闭模块末尾的词法范围内的
求值结果。在实现模块时,必须使用
let=
将代码绑定到名称(可以使用
\u
忽略名称)。它与交互式顶层(interactive
ocaml
程序)稍有不同,后者实际接受表达式并对其求值。比如说,

let result = start ^ "," in
  let result = result ^ result in
  let result = result ^ result in
  let result = result ^ result in
  let result = result ^ start in 
  result
不是有效的OCaml程序(可以放入
ml
文件并编译的程序)。因为它是一个表达式,而不是一个模块定义

let result = start ^ "," in
  let result = result ^ result in
  let result = result ^ result in
  let result = result ^ result in
  let result = result ^ start in 
  result