Erlang列表:filter/2不能使用逗号代替andalso

goo*_*nsu 4 erlang

以下代码在编译时给出警告:警告:使用运算符'>'无效

rd(a,{x,y}),
List = [#a{x=1,y=2}, #a{x=3,y=4}],
lists:filter(
    fun(E) ->
        E#a.x > 1, E#a.y =:= 2
    end, List).
Run Code Online (Sandbox Code Playgroud)

但是当我用逗号代替逗号时,没有警告.

ste*_*emm 7

在这种情况下使用逗号只分离两个动作,而不会相互影响:E#a.x > 1和下一个操作(这是函数的结果)E#a.y =:= 2

这意味着在您的情况下,过滤功能等于:

fun( E ) ->
   E#a.y =:= 2
end
Run Code Online (Sandbox Code Playgroud)

只有在你编写保护表达式时才使用逗号等于使用andalso,否则 - 逗号只是动作之间的分隔符.

因此,您可以通过两种方式重写您的功能:

1)

fun
(E) when E#a.x > 1, E#a.y =:= 2 ->
   true;
(_Othervise) ->
   false
end
Run Code Online (Sandbox Code Playgroud)

2)

 fun( E ) ->
    (E#a.x > 1) andalso (E#a.y =:= 2)
 end
Run Code Online (Sandbox Code Playgroud)