Почему моя строка типа "байты"?

Согласно Real World OCaml, тип "abc" должен быть string. Но на самом деле в моем utop REPL это тип bytes.

Я уже открыл Core.Std. Почему это?

(версия OCaml равна 4.02.2; Core is 112.24.01; utop is 1.18.)

Ответ 1

Вы должны включить безопасный режим строки явно. Просто запустите utop с помощью:

$ utop -safe-string

До введения типа bytes в OCaml 4.02 строки были изменчивыми. Теперь строки должны быть неизменными, а bytes - тип, который будет использоваться для "изменяемых строк".

Чтобы не сломать слишком много существующего кода, это различие еще не включено по умолчанию. В режиме по умолчанию bytes и string являются синонимами.

Ответ 2

В OCaml происходит медленное движение темпа от изменчивой строки до неизменяемой. Новое имя для изменяемой строки - bytes. Неизменяемый будет по-прежнему называться string. На момент написания bytes и string это просто синонимы, поэтому всякий раз, когда вы видите bytes, вы можете читать его как string. Более того, если вы обновите базовую версию до 112.35.00 или новее, вы не увидите эту проблему с bytes. Строка снова станет строкой.

Ответ 3

Как показано в @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.