Erlang sytax错误与';或';

Erlang sytax错误与';或';,erlang,Erlang,我在erlang中得到了一个非常新且简单的函数: function_x(L) -> X = lists:filter((fun(N)-> N =:= 2 end), L), Y = lists:filter((fun(N)-> N =:= 3 end), L), LX = length(X), LY = length(Y), LX == 2 or LY == 2. 编译源代码,我得到以下错误: syntax error before:

我在erlang中得到了一个非常新且简单的函数:

function_x(L) ->
    X = lists:filter((fun(N)-> N =:= 2 end), L),
    Y = lists:filter((fun(N)-> N =:= 3 end), L),
    LX = length(X),
    LY = length(Y),
    LX == 2 or LY == 2.
编译源代码,我得到以下错误:

syntax error before: '=='

我从or子句中提取一个表达式,它就工作了。正如你们所看到的,我在erlang是个新手,真的不明白为什么会发生这样的事情,如果事情看起来这么简单的话。有什么帮助吗?由于某种原因,==和“或”可能具有相同的运算符优先级,因此您需要更准确地告诉编译器您想要的是什么。您可以编写“(LX==2)或(LY==2)”或使用“orelse”代替“or”。

根据,或的优先级高于
=
。因此,您的书面表达被视为

LX == (2 or LY) == 2
这是一个语法错误。要解决此问题,必须在每个术语周围使用括号:

(LX == 2) or (LY == 2).
或者,您可以使用优先级低于
=
orelse

LX == 2 orelse LY == 2.

不,
的优先级高于
=
,因此表达式被解析为
LX==(2或LY)==2
,但由于
==
没有关联,这会导致解析错误。我在这里使用
或lse
。这是短路,可能会快一点。此外,没有理由评估RHS的效果。事实上,比较运算符并没有关联性,甚至连我都不感到惊讶,但当然,这不是你在任何理智的程序中都会写的东西,所以没有它可能会更好。谢谢!我对二郎失去了信心