R 是一种函数式语言,但在以下情况下它的行为类似于 C# 而不是 F#。
在 R 中
f <- function() x
x <- 15
f() // prints 15
x <- 20 // shadowing
f() // prints 20
在 C# 中
int j = 15;
Action<string> funs = x => Console.WriteLine(j);
funs("foo"); // prints 15
j = 20; // mutate
funs("foo"); // prints 20
在 F#
let x = 15
let f y = x
f() // prints 15
let x = 20 // shadowing, to mimic R (purely functional)
f() // prints 15, not 20
在 R 中,该示例违反了我对“闭包关闭变量,无论是按值还是按引用”的理解。在 C# 中,闭包通过引用关闭变量。在 F# 中,这并不重要,因为变量是不可变的。但是在 R 中,似乎闭包只关闭符号名称,(确定不是通过值,因为它确实改变了;不是通过引用,因为变量是不可变的,所以它不是变异而是被遮蔽)。
那么,闭包是否有 3 种方式关闭变量,按值、按引用和按名称?
在这种情况下,是否有任何其他函数式语言表现得像 R?
在这里, hadley书中定义的Dynamic Lookup似乎可以解释一下,但我找不到任何其他具有“动态查找”一词的资源。