为什么 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 是一个浮点数 - 但编译器不知道这一点。
然后将 mysqrt
与 100.0
进行比较。在 Erlang 中,数字总是比原子小,所以 mysqrt < 100.0
总是假的——这是编译器警告你的。
改为调用您的变量 MySqrt
,您的代码应该可以工作。
(此外,惯例是仅在未使用变量时才使用下划线开头的变量名,因为这样的名称会抑制来自编译器的 "unused variable" 警告。仅调用此函数的参数 X
而不是 _X
。)
当我尝试编译以下代码时:
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 是一个浮点数 - 但编译器不知道这一点。
然后将 mysqrt
与 100.0
进行比较。在 Erlang 中,数字总是比原子小,所以 mysqrt < 100.0
总是假的——这是编译器警告你的。
改为调用您的变量 MySqrt
,您的代码应该可以工作。
(此外,惯例是仅在未使用变量时才使用下划线开头的变量名,因为这样的名称会抑制来自编译器的 "unused variable" 警告。仅调用此函数的参数 X
而不是 _X
。)