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

Ben*_*Ben 12 ocaml ocaml-core

根据Real World OCaml,"abc"应该是这种类型string.但实际上在我的utopREPL中,它的类型bytes.

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

(版本OCaml4.02.2; Core112.24.01; utop1.18.)

raf*_*fix 13

您必须显式启用安全字符串模式.刚刚开始utop:

$ utop -safe-string
Run Code Online (Sandbox Code Playgroud)

在OCaml 4.02中引入类型之前bytes,字符串是可变的.现在,字符串旨在是不可变的,并且bytes是用于"可变字符串"的类型.

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


ivg*_*ivg 11

OCaml中从可变字符串到不可变字符的速度缓慢.可变字符串的新名称是bytes.仍然会调用不可变的string.在撰写本文时bytes,string它只是同义词,所以无论何时你看到bytes你都可以将其视为同义词string.此外,如果您将核心版本更新为112.35.00或更高版本,您将不会看到此问题bytes.String将再次成为字符串.


use*_*453 8

正如@ivg所说,OCaml中存在一个缓慢的移动以使string类型不可变,并且bytes类型将替换当前string类型,因为除了不可变的字符串之外还有可变字符串总是有用的.

从版本4.02.2开始,有单独的模块用于处理类型stringbytes(String以及Bytes分别),但它们都只是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"
Run Code Online (Sandbox Code Playgroud)

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