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 *)
当您需要或不需要
有点微妙,所以我通常用它来终止所有模块级实体,这样我就不必担心何时需要它,何时不需要它
代码>用于分隔单个表达式中的连续“语句”。Sofoo;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 *)