替换模型是否适用于闭包?或者你需要一个环境模型?

时间:2017-05-22 21:35:27

标签: javascript functional-programming computer-science lambda-calculus

EG。说这是我们的JavaScript代码:

let a = x => {
  let y = x * 2
  return z => x + y + z
}
let b = a(1)
let c = b(2)

我可以使用替换模型对此进行评估,还是需要环境模型?

我是这样开始的:

let c = ((x => {
  let y = x * 2
  return z => x + y + z
})(1))(2)

然后我需要在评估外部表达式(使用1调用)之前评估内部表达式(使用2调用)。但是对于替换它总是在外面。

这表明替代模型在这里不合适吗?或者从内到外以及从外向内进行评估是否犹豫不决?还是有其他方式来看待它吗?

1 个答案:

答案 0 :(得分:3)

替换模型适用于闭包。基本上,您用绑定值替换绑定。你不需要环境模型。

const b = a(1)                  // ==
const b = z => 1 + (1 * 2) + z

const c = b(2)             // ==
const c = 1 + (1 * 2) + 2  // ==
const c = 5              

只有当您真正需要使用let(在实际重新绑定它的情况下)您需要环境模型时才会这样做。

当谈到评估顺序时,很清楚,在a(1)(2)这两个调用中,你不能先用参数2进行第二次调用,因为它是在{a(1)的结果上调用的。 1}}。因此,您需要知道a(1)的结果,因此您需要先替换它,然后对该结果进行下一次调用。

let c = (x => {
  let y = x * 2
  return z => x + y + z
})(1)(2)
// substituting 1 for x ==>
let c = (z => 1 + 2 + z)(2)
// substituting 2 for z ==>
let c = 1 + 2 + 2