2010-08-16 116 views

回答

17

因爲它表示一個函數,它將類型unit的值作爲其參數。單位類型只有值「()」。這通常用於表示該功能將執行某種IO或引起副作用,並且不需要輸入。您提供的第二類簽名是值的簽名,而不是可應用的函數。如果某個表達式綁定了這個名字,那麼這個表達式就會在值綁定發生時被評估,而不是在它被引用的時候(與函數應用的情況一樣)。

+4

所以區別在於,通過讓一個函數帶有*某個*參數,您可以在引用它時強制執行評估,從而使IO在預期的時間內生效。 – qrest 2010-08-16 15:43:24

+6

準確!單位只是提供一個方便的價值來充當參數。出於這個原因,它經常用在這種情況下,因爲它是一種價值,但並不代表任何有意義的東西。當我說「引用」時,我有點用過黃鼠狼的話。我應該說「應用」(函數是值,因此與它們綁定的函數的名稱可以被引用而不被應用)。 – Gian 2010-08-16 15:53:05

4

單元()參數類似於C中的void參數。它表示一個函數,它不使用它的參數來計算某些內容。

在你的例子中,程序可以改變環境,所以它不能只是在程序開始時計算的靜態值,但同時它的值不依賴於它的參數。

例如:

let e1 = Unix.environment();; 
Unix.putenv "USER" "somebody_else";; 
let e2 = Unix.environment();; 
e1 = e2;; 

而且你可以看到e1e2是不同的,所以Unix.environment不能只是(string * string) array型的,但需要一個功能。

0

如果你是一個懶惰的語言,比如Haskell,沒有副作用並且對象只在需要的時候被評估,那麼就不需要這些虛擬參數。

在OCaml中,需要參數類型爲unit(其唯一值爲())用於凍結計算,直到提供參數。在這種情況下,它將凍結計算,直到要計算Unix.environment() - 這一點尤其重要,因爲它可能在整個時間內具有不同的值(同樣,OCaml有副作用)。

+0

不完全正確。 OCaml函數總是需要一個參數,所以如果評估是懶惰的,它不會改變任何需要提供參數的東西。 – 2015-08-03 18:41:38

相關問題