根据 Real World OCaml ,"abc"
的类型应为string
。但实际上在我的utop
REPL中,它的类型为bytes
。
我已经打开了Core.Std
。那是为什么?
(OCaml
的版本为4.02.2
; Core
为112.24.01
; utop
为1.18
。)
答案 0 :(得分:13)
您必须明确启用安全字符串模式。刚刚开始使用utop:
push r32
在OCaml 4.02中the introduction of类型$ utop -safe-string
之前,字符串是可变的。现在,字符串是不可变的,bytes
是用于“可变字符串”的类型。
为了不破坏过多的现有代码,默认情况下尚未启用此区别。在默认模式下,bytes
和bytes
是同义词。
答案 1 :(得分:11)
OCaml从可变字符串到不可变的节奏缓慢。可变字符串的新名称是bytes
。不可变的仍将被称为string
。截至撰写本文时bytes
和string
只是同义词,因此每当您看到bytes
时,您都可以将其视为string
。此外,如果您将核心版本更新为112.35.00或更高版本,则bytes
不会出现此问题。 String将再次成为字符串。
答案 2 :(得分:8)
正如@ivg所说,OCaml的移动缓慢使string
类型不可变,而bytes
类型将取代当前的string
类型,因为它始终是除了不可变的字符串之外,还有可变字符串。
从版本4.02.2开始,有单独的模块用于处理类型string
和bytes
(分别为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"
当然,正如@rafix所说,使用-safe-string
指令运行OCaml可以实现更正常的行为。