Ocaml 为什么我的字符串是'bytes'类型?

Ocaml 为什么我的字符串是'bytes'类型?,ocaml,ocaml-core,Ocaml,Ocaml Core,根据现实世界的OCaml,“abc”的类型应该是字符串。但实际上在我的utopREPL中,它是bytes类型 我已经打开了Core.Std。为什么呢 (OCaml的版本是4.02.2;Core是112.24.01;utop是1.18)必须明确启用安全字符串模式。只需从以下内容开始utop: $ utop -safe-string 在OCAML4.02中键入bytes之前,字符串是可变的。现在,字符串是不可变的,而字节是用于“可变字符串”的类型 为了不破坏太多现有代码,默认情况下尚未启用此区别。

根据现实世界的OCaml,
“abc”
的类型应该是
字符串
。但实际上在我的
utop
REPL中,它是
bytes
类型

我已经打开了
Core.Std
。为什么呢


(OCaml的版本是
4.02.2
Core
112.24.01
utop
1.18

必须明确启用安全字符串模式。只需从以下内容开始utop:

$ utop -safe-string
在OCAML4.02中键入
bytes
之前,字符串是可变的。现在,字符串是不可变的,而
字节
是用于“可变字符串”的类型


为了不破坏太多现有代码,默认情况下尚未启用此区别。在默认模式下,
字节
字符串
是同义的

在OCaml中,从可变字符串到不可变字符串的移动速度很慢。可变字符串的新名称是
字节
。不可变的仍将被称为
string
。在编写
bytes
string
时,它们只是同义词,因此每当您看到
bytes
时,您可以将其解读为
string
。此外,如果您将核心版本更新到112.35.00或更高版本,您将不会在
字节中看到此问题。字符串将再次变为字符串

正如@ivg所说,OCaml中有一个缓慢的动作,使得
字符串
类型不可变,而
字节
类型将取代当前的
字符串
类型,因为除了不可变的字符串外,还有可变的字符串总是很有用的

从版本4.02.2开始,有单独的模块用于处理类型
string
bytes
string
bytes
),但默认情况下它们都只使用
bytes


可以使用
字节来修改字节字符串。设置
或使用
来修改您发布的内容,这听起来像是启用此模式所需要的。那不是真的。这项建议的其他内容都写得很好。考虑删除这个误导性的建议。我认为@ IVG是正确的,因为你的第一句话措辞很尴尬,我会把它写成“为了实现这种行为,必须明确启用字符串模式”。
# 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"