在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表达有什么区别?
答案 0 :(得分:3)
在OCaml中有两个地方可以使用let
。在模块的顶层,您可以这样:
let pattern = expression
从本质上讲,模块是命名值的集合,let
的这种形式是定义名称及其值的方式。
另一方面,有一个OCaml表达式,如下所示:
let pattern = expression1 in expression2
从本质上讲,这是定义要在expression2
中使用的局部变量的方式。
您使用;
编写的代码不适用于这两种形式。 ;
用于将两个表达式组合为一个表达式。但是let pattern = value
不是表达式。它具有模块的顶级声明的形式。
删除;
时起作用的原因是您有两个顶级声明。只要代码出现在模块的顶层,就可以使用。在这种情况下,它将名称rodrigue
和diegue
定义为模块的命名值。
其他答案:
在最新版本的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解释器)不同。