[英]How to correctly use separators in 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表達之間有什么區別?
在OCaml中可以在兩個地方使用let
。 在模塊的頂層,您可以執行以下操作:
let pattern = expression
本質上,模塊是命名值的集合,而let
這種形式就是定義名稱及其值的方式。
另一方面,有一個OCaml表達式,如下所示:
let pattern = expression1 in expression2
本質上,這是定義要在expression2
使用的局部變量的expression2
。
您的代碼帶有;
不能同時使用這兩種形式。 A ;
用於將兩個表達式組合為一個表達式。 但是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
中的let x = 5 in x + 2
是值為7的表達式。
toplevel
名稱是OCaml退伍軍人所說的OCaml的read-eval-print循環。 換句話說,它是OCaml解釋器的名稱。
在上面的回答中,我使用“頂層”來表示模塊的最外層語法嵌套層。 它與頂層(OCaml解釋器)不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.