为什么 Erlang 编译器说我的子句计算为假?

Why is the Erlang compiler saying that my clause evaluates to false?

当我尝试编译以下代码时:

score(_X) -> mysqrt = math:sqrt(_X),
  if
    mysqrt < 100.0 -> true;
    true -> 0
  end.

编译器说:

src/leap.erl:16:此子句的守卫计算为 'false'

我想我正在分配一个变量 mysqrt 然后检查它的结果,它不一定必须小于 100.0. 显然这不是正在发生的事情。我做错了什么?

在 Erlang 中,变量名以大写字母或下划线开头。在您的代码中,mysqrt 不是一个变量,而是一个原子。

mysqrt = math:sqrt(_X) 因此是一个 断言 math:sqrt 的 return 值等于这个原子,这将失败,因为该函数 return 是一个浮点数 - 但编译器不知道这一点。

然后将 mysqrt100.0 进行比较。在 Erlang 中,数字总是比原子小,所以 mysqrt < 100.0 总是假的——这是编译器警告你的。

改为调用您的变量 MySqrt,您的代码应该可以工作。

(此外,惯例是仅在未使用变量时才使用下划线开头的变量名,因为这样的名称会抑制来自编译器的 "unused variable" 警告。仅调用此函数的参数 X 而不是 _X。)