gpt4 book ai didi

ocaml - 什么时候在 OCaml 中创建物理上不同的值?

转载 作者:行者123 更新时间:2023-12-04 23:26:43 24 4
gpt4 key购买 nike

我试图了解 OCaml 中物理相等运算符( Pervasives.(==)Pervasives.(!=) )的含义。

语言手册说表达式""是“常数”,而不是“表达式”:

6.5 Constants

constant ::== ... string-literal



但我找不到任何说明常量是单独/预先评估或合并的措辞,并且 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 Representation of OCaml data types”部分表明语言规范要求 bool 值、整数、字符、单位值、简单变体和空列表是无私的。

一个实现是否必须像上述那样才能成为符合 OCaml 的实现?

符合 OCaml 的实现可以重写 b 处的指针吗?指向 aa = b (* structurally *)是真的,并且两者都是不可变类型的值(或有效的不可变值,如零长度字符串/数组),有时这样做是为了减少分代 GC 中可到达的年轻值的数量?

最佳答案

当我阅读语言规范时,很少有关于值何时不同的保证。我相信唯一的保证是在 Pervasives module 的文档中。 :

On mutable types such as references, arrays, strings, records with mutable fields and objects with mutable instance variables, e1 == e2 is true if and only if physical modification of e1 also affects e2. On non-mutable types, the behavior of ( == ) is implementation-dependent; however, it is guaranteed that e1 == e2 implies compare e1 e2 = 0.



FP 的一个很酷的事情是编译器和运行时可以自由地用不可变的值做任意聪明的事情。所以这个保证是关于你真正想要的(恕我直言)。

总而言之,是的,运行时或编译器可以自由(再次,恕我直言)以任何它认为有帮助的方式共享(而不是共享)不可变值。

我不会将表示部分解释为语言规范的一部分。它只是当前实现的有用文档。

关于ocaml - 什么时候在 OCaml 中创建物理上不同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11820461/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com