2011-05-22 40 views
3

我試圖調和參考透明度的定義與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引用透明或我錯過了什麼?

+0

你問關於OCaml還是這些函數?你在這裏描述的功能不是透明的,因爲它們顯然不是副作用。 – 2011-05-22 23:52:32

+1

我在問OCaml,我不認爲副作用與參考透明度有關。純函數的memoized版本經常使用散列映射來存儲以前計算的值,但是即使修改散列映射被認爲是副作用,該函數本身仍然是引用透明的。 – davidk01 2011-05-23 00:56:41

回答

6

Ocaml不是透明地透明的,正如你所解釋的。

也許Matuszek希望強調Ocaml的功能方面,但在我看來他是誤導或錯誤的。

部分Expressions (but not statements)例如說OCaml is a purely functional languageOCaml claims to be stateless。部分Omissions

循環也被省略,但它們在純粹的功能語言中無論如何不是非常有用。

這很有趣,因爲如果沒有用,循環將不會被添加到Ocaml中。

1

引用透明意味着函數的上下文不會影響結果,而「純」函數是一個僅依賴其參數並且沒有副作用的函數。例如在

# let y = 10;; 
# let f x = (Printf.printf "%d+%d=%d\n" x y (x+y); x+y);; 
val f : int -> int = <fun> 
# f 5;; 
5+10=15 
- : int = 15 
# let y = 3;; 
val y : int = 3 
# f 5;; 
5+10=15 
- : int = 15 

我們看到f是引用透明的(因爲它在重新定義y時不會改變)但是不純。