如何在Ocaml中正确使用分隔符

时间:2019-01-08 18:33:27

标签: ocaml

在OCamel中考虑以下代码:

let rodrigue="The cid" ; let diegue="cid's father"

这给出了tryOcaml的语法错误。怎么了?当我删除;时,它似乎起作用;请帮忙。

另外, 僵硬。[4] <-'c'给出未知的构造函数错误。这是否意味着我们不能使用<-?作为僵硬。[4]是不可变的,还是有功能来更改字符串中的字符?

做什么?怎么办? 我尝试了4=4 ;6=5,它的值为bool = false。

4=4是表达式还是语句?

let x=5呢?

因此let x=8 let y=9执行两个语句,但$ 4 = 4; 5 = 6 $只计算最后一个表达式?

表达式和语句之间有什么区别?

什么是顶级?顶级和正常的OCamel表达有什么区别?

1 个答案:

答案 0 :(得分:3)

在OCaml中有两个地方可以使用let。在模块的顶层,您可以这样:

let pattern = expression

从本质上讲,模块是命名值的集合,let的这种形式是定义名称及其值的方式。

另一方面,有一个OCaml表达式,如下所示:

let pattern = expression1 in expression2

从本质上讲,这是定义要在expression2中使用的局部变量的方式。

您使用;编写的代码不适用于这两种形式。 ;用于将两个表达式组合为一个表达式。但是let pattern = value不是表达式。它具有模块的顶级声明的形式。

删除;时起作用的原因是您有两个顶级声明。只要代码出现在模块的顶层,就可以使用。在这种情况下,它将名称rodriguediegue定义为模块的命名值。

其他答案:

在最新版本的OCaml中,字符串不可变。如果需要可变性,则需要使用bytes类型。作为此更改的一部分,string.[...] <- ...标记已过时。您应该改用Bytes.set

# let mystring = "abc";;
val mystring : string = "abc"
# let mybytes = Bytes.of_string "abc";;
val mybytes : bytes = Bytes.of_string "abc"
# mystring.[0] <- 'b';;
Warning 3: deprecated: String.set
Use Bytes.set instead.
Error: This expression has type string but an expression was 
            expected of type bytes
# Bytes.set mybytes 0 'b';;
- : unit = ()
# mybytes;;
- : bytes = Bytes.of_string "bbc"

OCaml确实没有声明。在您可能会要求使用其他某些语言的语句的地方,您会使用类型unit的表达式。例如,OCaml中的for语句实际上是unit类型的表达式。

# for x = 1 to 1 do () done = ();;
- : bool = true

从这个角度来看,4 = 4是一个表达式,因为它的类型为bool(而不是unit)。

因此let x = 5既不是表达式也不是语句(这只是一种表达式)。正如我在上面指出的那样,它具有顶级模块声明的形式。因此,它只能出现在模块的顶部。

相反,let x = 5 in x + 2是一个值为7的表达式。

名称toplevel是OCaml退伍军人所说的OCaml的read-eval-print循环。换句话说,它是OCaml解释器的名称。

在上面的回答中,我使用“顶层”来表示模块的最外层语法嵌套层。它与顶层(OCaml解释器)不同。

相关问题