在 F# 中:
> let f x = x + 2;;
val f : int -> int
> let g x = f x;;
val g : int -> int
> g 10;;
val it : int = 12
> let f x = x + 3;;
val f : int -> int
> g 10;;
val it : int = 12
在 Clojure 中:
1:1 user=> (defn f [x] (+ x 2))
#'user/f
1:2 user=> (defn g [x] (f x))
#'user/g
1:3 user=> (g 10)
12
1:4 user=> (defn f [x] (+ x 3))
#'user/f
1:5 user=> (g 10)
13
请注意,在 Clojure 中,最新版本的 f 在最后一行被调用。然而,在 F# 中,仍然调用旧版本的 f。为什么会这样以及它是如何工作的?
最佳答案
在 Clojure 中 f
符号捕获名称 f
,而在 F# 中 f
符号捕获 f
的值。所以在 Clojure 中每次调用 g
它查找f
在 F# 中每次调用 g
时找出该名称当时指的是什么使用 f
的值曾当g
函数最初是创建的。
关于f# - F# 和 Clojure 调用重新定义函数时的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2570628/