我試圖調和參考透明度的定義與OCaml如何處理多態類型和副作用。我對http://www.csc.villanova.edu/~dmatusze/resources/ocaml/ocaml.html讀到OCaml中的參考透明度
的定義是說有引用透明,如果它的意義並不取決於它是在中OCaml的功能都引用透明的情況下,即,改變的背景下(其他變量和其他函數)不會改變您已經定義的任何函數的含義。在調試程序時,這一事實可能至關重要,因爲您可能會相當頻繁地重新定義函數。
但是,我明白的事情,這在OCaml中不可能是真實的,因爲在返回任何東西之前,可能會執行一大堆副作用(如寫入文件和執行其他計算)功能。
您可能有一個功能f : string -> string
,以便f "a"
不等於f "a"
。在f
的類型描述中,我們可以將一些副作用表達式放入函數的主體中,這些副作用是完全不可見的。
作爲示例,f
可以定義爲返回某個文件的第一行。在f
的上下文中可能有某個功能發生了變化,這會影響第一行f
返回的內容。或者更糟糕的是,上下文中的某些功能可能會刪除f
依賴的文件,這會使f
未定義。
所以是OCaml引用透明或我錯過了什麼?
你問關於OCaml還是這些函數?你在這裏描述的功能不是透明的,因爲它們顯然不是副作用。 – 2011-05-22 23:52:32
我在問OCaml,我不認爲副作用與參考透明度有關。純函數的memoized版本經常使用散列映射來存儲以前計算的值,但是即使修改散列映射被認爲是副作用,該函數本身仍然是引用透明的。 – davidk01 2011-05-23 00:56:41