Почему компилятор Erlang говорит, что мое предложение оценивается как ложное? - PullRequest
0 голосов
/ 17 февраля 2019

Когда я пытаюсь скомпилировать следующий код:

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

Компилятор говорит:

src / leap.erl: 16: защита для этого предложения оценивается как 'false'

Я думаю, что присваиваю переменную mysqrt, а затем проверяю ее результат, который не обязательно должен быть меньше 100.0. Очевидно, это не то, что происходит.Что я делаю не так?

1 Ответ

0 голосов
/ 17 февраля 2019

В Erlang имена переменных начинаются с заглавной буквы или подчеркивания.В вашем коде mysqrt является не переменной, а атомом.

Строка mysqrt = math:sqrt(_X) является, таким образом, утверждением , что возвращаемое значение math:sqrt равен этому атому, который завершится ошибкой, потому что эта функция возвращает число с плавающей запятой - но компилятор не знает этого.

Затем вы сравниваете mysqrt с 100.0.В Erlang числа всегда сравниваются как атомы, поэтому mysqrt < 100.0 всегда ложно - это то, о чем вас предупреждает компилятор.

Вместо этого назовите вашу переменную MySqrt, и ваш код должен работать.

(Кроме того, условием является использование имен переменных, начинающихся с подчеркивания, только когда переменная не используется, так как такие имена подавляют предупреждения «неиспользуемой переменной» от компилятора. Было бы более идиоматичным просто вызывать аргументк этой функции X вместо _X.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...