2011-05-20 70 views
0

在此示例中,正在熱切評估get_final_answer,並且始終返回0.0。我認爲包含refs的表達式由於它們固有的可變特性而被區別對待(在這種情況下並不熱切地進行評估)。我預計它會回到7.0。在函數內部解引用ref會產生不同的結果。爲什麼?

let FinalAnswer = ref 0.0 
let get_final_answer = !FinalAnswer 

let rec eval_expr_fail = 
     FinalAnswer := 7.0 
     get_final_answer  // fails, returns 0.0 

let rec eval_expr_works = 
     FinalAnswer := 7.0 
     !FinalAnswer   // works, return 7.0 

如何在我更新它的塊之外的情況下解除引用FinalAnswer?

回答

6

get_final_answer in let get_final_answer = !FinalAnswer是一個浮點值,而不是函數。值爲0.0,一旦賦值,與FinalAnswer無關。

使得它作爲一個功能,讓你想要的東西:

let FinalAnswer = ref 0.0 
let get_final_answer() = !FinalAnswer 

let rec eval_expr_fail = 
     FinalAnswer := 7.0 
     get_final_answer()  // returns 7.0 
+2

功能都值了!你的意思是「是一個浮點數,而不是一個函數」。 – petebu 2011-05-20 12:35:24

相關問題