[英]OCaml - Why doesn't the the function change its output?
我的教授今天向我們展示了這段代碼,但我似乎無法理解它的結果:
# let a = 2;;
val a : int = 2
# let f = fun x -> fun y -> if x = y then a + 2 else a - 10;;
val : f 'a -> 'a -> int = <fun>
# f 1 (2 - 1);;
- : int = 4
# let a = 18;;
val a : int = 18
# f 1 (2 - 1);;
- : int = 4
??? 因此,基本上,我希望看到以下結果:
- : int = 20
為什么這不是輸出?
這是因為let a
引入了一個具有相同名稱的新變量,但是該函數在其作用域內仍引用該變量-這是一個閉包 ,而其關閉的變量是一個常量。 它不會在調用它的范圍內動態查找變量名。
通過將可變引用存儲在可以分配給的變量中,可以實現預期的行為:
# let a = ref 2;;
let f = fun x -> fun y -> if x = y then !a + 2 else !a - 10;;
f 1 (2 - 1);;
- : int = 4
# a := 18;;
f 1 (2 - 1);;
- : int = 20
但是,請注意,這通常是不希望的。 變量應該是常量,以便我們可以爭論函數f
在被調用時總是返回4
或8
,而不是讓結果取決於在何處以及何時將值分配給參考單元。 盡可能避免它們。 在此特定示例中,可以這樣執行:
let f a x y = 2 + if x = y then 2 else -10 in
let g = f 2 in
print_int (g 1 (2-1));
let h = f 18 in
print_int (h 1 (2-1));;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.