Syntax OCaml分隔符和作用域 我正在学习OCaml,虽然我有多年的命令式编程语言(C,C++,java)的经验,但是我在OcAML语法中的声明或表达式之间会有一些分隔符的问题。

Syntax OCaml分隔符和作用域 我正在学习OCaml,虽然我有多年的命令式编程语言(C,C++,java)的经验,但是我在OcAML语法中的声明或表达式之间会有一些分隔符的问题。,syntax,ocaml,delimiter,Syntax,Ocaml,Delimiter,基本上我知道我必须使用连接表达式,序列返回的值将是最后使用的表达式之一,例如,如果 exp1; exp2; exp3 它将被视为返回exp3值的表达式。从这个开始,我可以使用 let t = something in exp1; exp2; exp3 应该没问题吧 我应该什么时候使用双半圆?这到底是什么意思 是否有其他必须使用的分隔符来避免语法错误 我给你举个例子: let rec satisfy dtmc state pformula = match (state, pformula

基本上我知道我必须使用
连接表达式,序列返回的值将是最后使用的表达式之一,例如,如果

exp1; exp2; exp3
它将被视为返回
exp3
值的表达式。从这个开始,我可以使用

let t = something in exp1; exp2; exp3
应该没问题吧

我应该什么时候使用双半圆?这到底是什么意思

是否有其他必须使用的分隔符来避免语法错误

我给你举个例子:

let rec satisfy dtmc state pformula = 
  match (state, pformula) with
    (state, `Next sformula) ->
        let s = satisfy_each dtmc sformula
        and adder a state = 
            let p = 0.; 
            for i = 0 to dtmc.matrix.rows do
                    p <- p +. get dtmc.matrix i state.index
            done;
            a +. p
        in
            List.fold_left adder 0. s
      | _ -> []
让rec满足dtmc状态公式=
将(州、公式)与
(说明,`下一个公式)->
设s=满足每个dtmc公式
和加法器a状态=
设p=0。;
对于i=0到dtmc.matrix.rows do
p[]
它给了我关于
|
的语法错误,但我不明白为什么。。我错过了什么?这是一个经常发生的问题,我必须尝试许多不同的解决方案,直到它突然起作用:/

附带问题:用
let
声明,而不是
let。。在
中,将定义一个var绑定,该绑定在定义后的任何时候都会持续

我基本上要问的是:我必须使用什么分隔符,以及何时必须使用它们。此外,在使用解释器<代码> OcAML时,应该考虑的不同点是编译器>代码> OcAMLC?< /代码> <强> > /P> 提前谢谢

let p = 0.; 
这就是错误所在。
必须是中的
。不能在
中使用
let
而不使用
,只能定义全局函数,不能在表达式中使用它

一个附带问题:用let代替let声明。。在中,将定义一个var绑定,该绑定在定义之后的任何时候都会持续

您只能使用其中一种(交互式解释器除外,在该解释器中,您可以混合使用表达式和定义)。定义全局函数或值时,您需要
中不包含
。在表达式中,您需要
一起进入

这就是错误所在。
必须是
中的
。不能在
中使用
let
而不使用
,只能定义全局函数,不能在表达式中使用它

一个附带问题:用let代替let声明。。在中,将定义一个var绑定,该绑定在定义之后的任何时候都会持续


您只能使用其中一种(交互式解释器除外,在该解释器中,您可以混合使用表达式和定义)。定义全局函数或值时,您需要
中不包含
。在表达式中,您需要
一起进入
用于在
ocaml
REPL中终止输入并开始解释,在使用
ocamlc
ocamlopt
编译时,它没有特殊意义


不能使用
;;为任意值赋值
用于在
ocaml
REPL中终止输入并开始解释,在使用
ocamlc
ocamlopt
编译时,它没有特殊意义


您不能使用
分隔符终止顶级实体。在
ocaml
toplevel(解释器)中,它向解释器发出信号,表示特定的输入已完成,应进行评估

在使用
ocamlc
ocamlopt
编译的程序中,您不需要经常使用它,因为连续的顶级
let
(在
中没有
)、
模块
类型
异常
,以及类似语句会自动发出新“短语”开始的信号。如果在一个模块中包含一个顶级表达式,而该表达式只针对其副作用进行计算(例如生成一些输出或注册模块),则需要一个
let
,它将假定新表达式是let的一部分。例如:

let msg = "Hello, world";; (* we need ;; here *)
print_endline msg;; (* ;; is optional here, unless we have another expression *)
当您需要或不需要
有点微妙,所以我通常用它来终止所有模块级实体,这样我就不必担心何时需要它,何时不需要它

用于分隔单个表达式中的连续“语句”。So
foo;bar
是由
foo
bar
组成的单一顺序表达式,而
foo;;条形码仅在模块的顶层有效,表示两个表达式


上,让
中不使用
:该构造仅在模块定义中有效,并且如此绑定的变量将被绑定到模块的末尾。通常,这只是文件的结尾;但是,如果您有嵌套模块,则其范围可能会更有限。除非它在本地模块定义中,否则它在另一个表达式或定义(如函数定义)中不起作用。

分隔符终止顶级实体。在
ocaml
toplevel(解释器)中,它向解释器发出信号,表示特定的输入已完成,应进行评估

在使用
ocamlc
ocamlopt
编译的程序中,您不需要经常使用它,因为连续的顶级
let
(在
中没有
)、
模块
类型
异常
,以及类似语句会自动发出新“短语”开始的信号。如果在模块中包含顶级表达式
let msg = "Hello, world";; (* we need ;; here *)
print_endline msg;; (* ;; is optional here, unless we have another expression *)