根据Real World OCaml,"abc"应该是这种类型string.但实际上在我的utopREPL中,它的类型bytes.
我已经打开了Core.Std.这是为什么?
(版本OCaml是4.02.2; Core是112.24.01; utop是1.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将再次成为字符串.
正如@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"
Run Code Online (Sandbox Code Playgroud)
当然-safe-string,正如@rafix所说,通过使用指令运行OCaml可以实现更正常的行为.
| 归档时间: |
|
| 查看次数: |
3421 次 |
| 最近记录: |