Согласно Real World OCaml, тип "abc"
должен быть string
. Но на самом деле в моем utop
REPL это тип bytes
.
Я уже открыл Core.Std
. Почему это?
(версия OCaml
равна 4.02.2
; Core
is 112.24.01
; utop
is 1.18
.)
Согласно Real World OCaml, тип "abc"
должен быть string
. Но на самом деле в моем utop
REPL это тип bytes
.
Я уже открыл Core.Std
. Почему это?
(версия OCaml
равна 4.02.2
; Core
is 112.24.01
; utop
is 1.18
.)
Вы должны включить безопасный режим строки явно. Просто запустите utop с помощью:
$ utop -safe-string
До введения типа bytes
в OCaml 4.02 строки были изменчивыми. Теперь строки должны быть неизменными, а bytes
- тип, который будет использоваться для "изменяемых строк".
Чтобы не сломать слишком много существующего кода, это различие еще не включено по умолчанию. В режиме по умолчанию bytes
и string
являются синонимами.
В OCaml происходит медленное движение темпа от изменчивой строки до неизменяемой. Новое имя для изменяемой строки - bytes
. Неизменяемый будет по-прежнему называться string
. На момент написания bytes
и string
это просто синонимы, поэтому всякий раз, когда вы видите bytes
, вы можете читать его как string
. Более того, если вы обновите базовую версию до 112.35.00 или новее, вы не увидите эту проблему с bytes
. Строка снова станет строкой.
Как показано в @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"
Конечно, более нормальное поведение может быть достигнуто путем запуска OCaml с директивой -safe-string
, как указано в @rafix.