我试图了解 OCaml 中的物理相等运算符 (Pervasives.(==)
和Pervasives.(!=)
) 的含义。
语言手册说表达式""
是“常量”,而不是“表达式”:
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 数据类型的表示”部分建议语言规范要求 bools、ints、chars、单位值、简单变体和空列表是无私的。
实现是否必须像上面那样才能成为符合 OCaml 的实现?
兼容的 OCaml 实现是否可以重写指针b
以指向a
何时a = b (* structurally *)
为真,并且两者都是不可变类型的值(或有效的不可变值,如零长度字符串/数组),有时这样做是为了减少一代中可到达的较年轻值的数量GC?