2015-07-19 64 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所述实现。

相关问题