0

我正在学习 OCaml,尽管我在命令式编程语言(C、C++、Java)方面拥有多年经验,但在 OCaml 语法中的声明或表达式之间的分隔符方面遇到了一些问题。

基本上我明白我必须用来;连接表达式,并且序列返回的值将是最后使用的表达式之一,例如,如果我有

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
      | _ -> []

它给了我语法错误,|但我不明白为什么..我错过了什么?这是一个经常发生的问题,我必须尝试许多不同的解决方案,直到它突然起作用:/

一个附带问题:let改为声明let .. in将定义一个 var 绑定,该绑定在定义后持续存在?

我基本上要问的是:我必须使用什么分隔符以及何时必须使用它们。此外,在使用解释器ocaml而不是编译器时,我应该考虑哪些差异ocamlc?

提前致谢!

4

3 回答 3

2
let p = 0.; 

这是错误。;需要是一个in. 你不能使用letwithoutin来定义全局函数,你不能在表达式中使用它。

一个附带的问题:用 let 声明 let .. in 将定义一个 var 绑定,该绑定在定义后持续存在?

您只能使用其中一种(在交互式解释器中允许混合表达式和定义除外)。定义全局函数或值时,您需要let不带in. 在您需要的表达式let中使用in.

于 2010-06-13T16:10:31.620 回答
2

;;定界符终止顶级实体。在ocaml顶层(解释器)中,它向解释器发出信号,表明特定的输入已经完成并且应该被评估。

在要使用ocamlcor编译的程序中ocamlopt,您不需要经常使用它,因为连续的顶级let(不带in)、moduletypeexception和类似的语句会自动表示新“短语”的开始。如果您在模块中包含一个顶级表达式,该表达式仅对其副作用进行评估(例如生成一些输出或注册模块),您需要;;在它之前告诉编译器停止编译前一个短语并开始编译新事物。否则,如果前面的东西是 a let,它将假定新的表达式是 let 的一部分。例如:

let msg = "Hello, world";; (* we need ;; here *)
print_endline msg;; (* ;; is optional here, unless we have another expression *)

当你需要和不需要;;的时候有点微妙,所以我通常用它来终止我的所有模块级实体,所以我不必担心什么时候需要和不需要。

;用于分隔单个表达式中的顺序“语句” 。由andfoo; bar组成的单个顺序表达式也是如此,而 while仅在模块的顶层有效并表示两个表达式。foobarfoo;; bar

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

于 2010-06-15T00:05:45.403 回答
2

;;在 REPL 中用于终止输入并开始解释,使用orocaml编译时没有特殊含义。ocamlcocamlopt

您不能使用<-运算符分配给任意值,您必须ref对可变变量使用类型:

let p = ref 0. in
for i = 0 to dtmc.matrix.rows do
    p := !p +. get dtmc.matrix i state.index
done;
a +. !p
于 2010-06-13T16:29:10.527 回答