簡體   English   中英

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

[英]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不是表達式。 它具有模塊的頂級聲明的形式。

刪除;時起作用的原因; 那么您就有兩個頂級聲明。 只要代碼出現在模塊的頂層,就可以使用。 在這種情況下,它定義了名稱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中的let x = 5 in x + 2是值為7的表達式。

toplevel名稱是OCaml退伍軍人所說的OCaml的read-eval-print循環。 換句話說,它是OCaml解釋器的名稱。

在上面的回答中,我使用“頂層”來表示模塊的最外層語法嵌套層。 它與頂層(OCaml解釋器)不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM