簡體   English   中英

OCaml-函數為什么不更改其輸出?

[英]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在被調用時總是返回48 ,而不是讓結果取決於在何處以及何時將值分配給參考單元。 盡可能避免它們。 在此特定示例中,可以這樣執行:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM