[英]When are physically distinct values created in OCaml?
我試圖理解物理相等運算符( Pervasives.(==)
和Pervasives.(!=)
)在OCaml中的含義。
語言手冊說表達式""
是“常量”,而不是“表達式”:
6.5常數
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 OCaml數據類型的表示 ”一節表明,語言規范要求bool,int,chars,單位值,簡單變體和空列表都是無私的。
實現是否必須像上面那樣成為一個符合要求的OCaml實現?
一個符合條件的OCaml實現可以重寫b
處的指針指向a
當a = b (* structurally *)
為真且兩者都是不可變類型的值(或有效不可變值,如零長度字符串/數組),有時會這樣做減少代際GC中可達到的較年輕值的數量?
當我閱讀語言規范時,很少有關於何時值不同的保證。 我相信唯一的保證是在Pervasives模塊的文檔中:
在可變類型(如引用,數組,字符串,具有可變字段的記錄和具有可變實例變量的對象)上,當且僅當e1的物理修改也影響e2時,e1 == e2才為真。 在非可變類型上,(==)的行為是依賴於實現的; 但是,保證e1 == e2意味着比較e1 e2 = 0。
關於FP的一個很酷的事情是編譯器和運行時可以使用不可變值自由地做任意聰明的事情。 所以這個保證就是你真正想擁有的(恕我直言)。
總之,是的,運行時或編譯器是免費的(再次,恕我直言)以任何它認為有用的方式共享(而不是共享)不可變值。
我不會將表示部分解釋為語言規范的一部分。 它只是當前實現的有用文檔。
只是一個注釋:字符串常量的匯集方式與您測試的方式不同:
let f () = "foo"
let b = f () == f () (* true *)
如果你改變f ()
調用的輸出,這可能確實會導致錯誤:這也將影響所有進一步的調用。 關於該行為的共識是可變字符串是一個歷史錯誤(一個應該具有與主字符串類型不同的可變緩沖區類型,編碼選擇和連接復雜性應該更重要)並且語義破壞池很有趣性能方面允許假設字符串常量沒有變異。 如果想要避免池化,則應該直接在字符串常量上調用String.copy
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.