匿名有趣谓词中闭包变量的模式匹配

时间:2012-02-12 00:02:47

标签: erlang

我知道,标题很糟糕......不知道如何解释我在问什么,那么一些代码怎么样?

设置:

L = [1,2,3,4,5,6,7,8,9].
X = 5.
Y = 10.

这就是我现在正在做的事情:

lists:any(fun(Z) when Z == X -> true; (_) -> false end, L). => true
lists:any(fun(Z) when Z == Y -> true; (_) -> false end, L). => false

我想做的是这样的事情没有保护声明(我不知道为什么,只是好奇是否可能。

我想知道你是否可以做这样的事情(是的,我知道有趣的X中的X会产生一个本地范围的变量):

lists:any(fun(X) -> true; (_) -> false end, L).

2 个答案:

答案 0 :(得分:7)

这个特别的可以写成:

lists:any(fun(Z) -> Z =:= X end, L).

答案 1 :(得分:4)

回答你的主要问题:这是不可能的。在fun子句的头部,所有变量都被视为新变量,并将隐藏环境中的任何现有绑定。您必须使用保护来将捕获的变量与参数变量匹配。