почему использование _ предотвращает появление предупреждений - PullRequest
0 голосов
/ 14 апреля 2019

У меня есть следующий код (это тест, поэтому он ничего интересного не делает)

let test k =
   let rec aux = function 
     |0 -> 0
     |z when z = 2 -> raise Exit 
     |_ -> aux (k-1) 
   in try let _ = aux k in true
   with Exit -> false

В конце используется синтаксис: let _, для меня это просто синтаксис, когда у вас нет идеи имени, которое вы можете использовать для определения своей функции.

Еще, если я сделаю следующее:

let test k =
   let rec aux = function 
     |0 -> 0
     |z when z = 2 -> raise Exit 
     |_ -> aux (k-1) 
   in try let b = aux k in true
   with Exit -> false

Я получаю предупреждение типа: «переменная b не используется», я не понимаю, почему существует разница между let _ и let b?

Например, я знаю, что при работе с типом юнитов обычно используется синтаксис: let (). Тем не менее, у меня нет никаких предупреждений при выполнении:

let b = print_int 2 

, даже если я не использую:

let () = print_int 2 

Так что особенного в let _?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

Это соглашение, признанное компилятором, для указания того, что вы не собираетесь использовать результат вычисления, например,

let a = 5 + 6 in
()

будет (или не будет, в зависимости от ваших настроек предупреждений) вызывать предупреждение о неиспользуемой переменной, поскольку вы четко привязали результат к переменной a, но не использовали ее в оставшейся части вычислений. В императивных языках довольно часто вычислять выражения для их побочных эффектов и игнорировать полученные значения, если таковые имеются. Поскольку OCaml - это функциональный язык, в котором значения используются для получения значений, он обычно является индикатором ошибки, когда вы забыли использовать связанную переменную.

Поэтому, чтобы явно указать компилятору, что вы игнорируете значение, вы можете начать свою переменную с подчеркивания, например,

let _unusued = 5 + 6 in 
()

Вы можете просто использовать шаблон _ (который также начинается с подчеркивания).

0 голосов
/ 14 апреля 2019

У вас есть предупреждение со вторым кодом, потому что вы определяете переменную b, содержащую значение, и не используете ее после. Лучшее использование, если вы не хотите использовать результат какого-либо выражения, - отбросить его результат, используя конструкцию let_ = (она говорит, что вы хотите, чтобы выражение было оценено, для потенциальных побочных эффектов, но не хотите сохранять его результат).

Что касается второй части вашего вопроса, я думаю, что существуют разные правила, связанные с верхним циклом, поэтому поведение может быть несопоставимым. В первой части вы определяете b внутри функции, а во второй части вы определяете b внутри верхнего цикла. В верхнем цикле вы можете определить переменные, которые вы не будете использовать без предупреждения.

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