2014-02-19 50 views
1
# let counter() = 
    let c = ref 0 in 
    fun() -> 
     let _ = c := !c + 1 in 
     !c ;; 
val counter : unit -> unit -> int = <fun> 

# let incCounter = counter() ;; 

# incCounter() ;; 
- : int = 1 

# incCounter() ;; 
- : int = 2 

我不明白爲什麼行let c = ref 0不會再次調用每次調用incCounter() ;;時間輸出。看起來fun() ->...這部分似乎只適用於每次撥打incCounterc很難理解的這種OCaml的代碼

+0

提示遞增代碼的一個提示:有Pervasives.incr做到這一點,所以第4行可以重寫爲_incr c_(好的,gsg說...) –

回答

4

每當調用counter(並不是每次調用incCounter時)都會調用線路let c = ref 0

counter的類型是unit -> unit -> int,這意味着counter()返回類型爲unit -> int的函數。如果我們說let incCounter = counter(),我們獲得一個新創建的函數unit -> int。該功能反過來會修改之前由電話counter()構建的參考。

也就是說,counter()的目的是構建一個新的計數器,然後可以增加。

+0

感謝它現在對我有意義 – nuclear

0

這是正確的。每次調用特定函數值時,都會訪問相同的參考單元。如果再次調用counter,則會得到一個訪問不同參考單元的不同函數值。

順便提一句,incr c是一種更清晰的方式來表示let _ = c := c + 1 in ...

+0

感謝它現在對我有意義 – nuclear