2015-07-19 59 views
10

真實世界的OCaml的​​類型應該是string。但實際上在我的utop REPL中,它的類型是bytes。我已經打開Core.Std。這是爲什麼?爲什麼我的「字節」類型的字符串?

(的OCaml版本爲4.02.2; Core112.24.01; utop1.18

回答

12

必須明確啓用安全的字符串模式。剛開始用UTOP:OCaml中4.02

$ utop -safe-string 

之前the introduction ofbytes,字符串是可變的。現在,字符串意圖是不可變的,並且bytes是用於「可變字符串」的類型。

爲了不打破太多現有的代碼,默認情況下這種區別尚未啓用。在默認模式下,bytesstring是同義詞。

+0

您發佈的聲音確實需要啓用此模式。這不是真的。其他所有建議都寫得很好。考慮刪除這個誤導性的建議。 – ivg

+0

我認爲@ivg是正確的,因爲您的第一句話措辭笨拙,我會將它寫爲「爲了實現此行爲,必須明確啓用字符串模式」 – user1030453

10

有OCaml中的可變字符串不可變的緩慢腳步動作。可變字符串的新名稱是bytes。不變的將仍然被稱爲string。在撰寫bytesstring的時間都只是同義詞,所以每當你看到bytes你可以把它讀作string。此外,如果您將核心版本更新至112.35.00或更高版本,則bytes將不會看到此問題。字符串將重新變成字符串。

8

正如@ivg說,有OCaml中緩慢的移動,使string型不變,且bytes類型將會取代目前的string類型,因爲它總是有用的,除了不可改變的人可變字符串。

由於4.02.2版本,也有同類型stringbytesStringBytes,分別)工作獨立的模塊,但他們都只是默認使用bytes

可以使用Bytes.set或使用<-運算符修改字節字符串,但後一種方法會發出警告。例如:

# let byte_string = "dolphins";; 
val byte_string : bytes = "dolphins" 
# byte_string.[0] <- 'w';; 
Characters 0-15: 
Warning 3: deprecated: String.set 
Use Bytes.set instead. 
Characters 0-15: 
Warning 3: deprecated: String.set 
Use Bytes.set instead. 
- : unit =() 
# byte_string;; 
- : bytes = "wolphins" 

當然,更正常行爲可以通過與-safe-string指令運行的OCaml作爲@rafix所述實現。

相關問題