为什么变量可以在List Comprehensions中变量?

时间:2012-08-15 06:48:07

标签: erlang

我们知道变量在erlang中不可变。但考虑一下这段代码,为什么[1,2,3,4]的每个值都按顺序模式匹配到N,并且不抛出异常?

1> [2*N || N <- [1,2,3,4]].
[2,4,6,8]

1 个答案:

答案 0 :(得分:4)

说变量不能变量并不完全正确。更多的是变量只能分配一次。所以下面的伪代码是非法的:

N = 4;
foo(N);
N = N + 1;
foo(N);

但是,以下是合法的:

fact(0) -> 1,
fact(N) -> N * fact(N-1).

当我们调用fact(4)时,对于每个不同的函数调用,N将取值4然后是3然后是2然后是1。您在上面显示的代码类似。对于列表中的每个项目,N采用不同的值。但是你从来没有多次赋予N的值。