为什么我的字符串类型为`bytes`?

时间:2015-07-19 11:13:28

标签: ocaml ocaml-core

根据 Real World OCaml "abc"的类型应为string。但实际上在我的utop REPL中,它的类型为bytes

我已经打开了Core.Std。那是为什么?

OCaml的版本为4.02.2; Core112.24.01; utop1.18。)

3 个答案:

答案 0 :(得分:13)

您必须明确启用安全字符串模式。刚刚开始使用utop:

push r32

在OCaml 4.02中the introduction of类型$ utop -safe-string 之前,字符串是可变的。现在,字符串是不可变的,bytes是用于“可变字符串”的类型。

为了不破坏过多的现有代码,默认情况下尚未启用此区别。在默认模式下,bytesbytes是同义词。

答案 1 :(得分:11)

OCaml从可变字符串到不可变的节奏缓慢。可变字符串的新名称是bytes。不可变的仍将被称为string。截至撰写本文时bytesstring只是同义词,因此每当您看到bytes时,您都可以将其视为string。此外,如果您将核心版本更新为112.35.00或更高版本,则bytes不会出现此问题。 String将再次成为字符串。

答案 2 :(得分:8)

正如@ivg所说,OCaml的移动缓慢使string类型不可变,而bytes类型将取代当前的string类型,因为它始终是除了不可变的字符串之外,还有可变字符串。

从版本4.02.2开始,有单独的模块用于处理类型stringbytes(分别为StringBytes),但它们都只是默认情况下使用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"

当然,正如@rafix所说,使用-safe-string指令运行OCaml可以实现更正常的行为。