Я пытаюсь понять, что означают операторы физического равенства (Pervasives.(==)
и Pervasives.(!=)
) в OCaml.
В руководстве по языку сказано, что выражение ""
является «константой», а не «выражением»:
6.5 Константы
константа :: == ... строковый литерал
но я не могу найти никаких слов о том, что константы оцениваются по отдельности / предварительно оцениваются или объединяются, а REPL указывает, что изменяемые строковые значения (к счастью) не объединяются.
(* a *) "" == "";; (* false *)
(* b *) "foo" == "foo";; (* false *)
(* c *) "" == String.copy "";; (* false *)
(* d *) () == ();; (* true *)
(* e *) (42, -42) == (42, -42);; (* false *)
(* f *) ("", 1) == ("", 1);; (* false *)
(* g *) None == None;; (* true *)
(* h *) (Some None) == (Some None);; (* false *)
Раздел «19.3 Представление типов данных OCaml» предполагает, что спецификация языка требует, чтобы буллы, целые числа, символы, значение единицы, простые варианты и пустые списки были бескорыстными.
Должна ли реализация вести себя, как указано выше, чтобы соответствовать реализации OCaml?
Может ли соответствующая реализация OCaml переписать указатель на b
, чтобы он указывал на a
, когда a = b (* structurally *)
истинно, и оба являются значениями неизменяемого типа (или фактически неизменяемыми значениями, такими как строки / массивы нулевой длины), как это иногда делается для уменьшения количества достижимых более молодых значений в генеральном GC?