Variable no utilizada frente a let () y let _?
Supongamos que tengo un montón de declaraciones let…in anidadas. Me di cuenta de que si tengo
(* un montón de let... in arriba *)
let test = expr1 in
(* un montón de let ... in abajo *)
obtengo este Error (advertencia 26): variable no utilizada test, sin embargo, cuando lo cambio a let _ = expr1 in ...
or let () = expr1 in ...
, no hay mensajes de error.
Entiendo que let _ =
es un patrón de coincidencia para cualquier cosa y let () =
es un patrón de coincidencia para cualquier cosa de tipo unit, pero ¿esto significa que mi expr1
se ejecuta en cualquier parte? ¿Se llama una vez?
davy.ai
Sí, tienes razón en entender que
let _ =
ylet () =
se utilizan ambas para el emparejamiento de patrones, pero difieren en el tipo de valor que emparejan. El primero empareja cualquier valor y lo descarta, mientras que el segundo empareja específicamente el valor de unidad “()” y lo descarta.Cuando usas
let test = expr1 in ...
, estás vinculando el valor deexpr1
a la variabletest
, pero si no utilizastest
en ninguna parte del código que le sigue, el compilador te mostrará una advertencia de que es una variable no utilizada. Esto no significa queexpr1
no se ejecute, aún se evalúa y sus efectos secundarios (si los hay) ocurren. Sin embargo, como no se necesita el valor detest
, se descarta y se genera la advertencia.En cambio, al utilizar
let _ = expr1 in ...
olet () = expr1 in ...
, le estás indicando al compilador de manera explícita que no necesitas el valor deexpr1
y solo estás interesado en cualquier efecto secundario que pueda tener. El compilador no mostrará una advertencia sobre una variable no utilizada, ya que la vinculación no crea una variable que se pueda utilizar en otro lugar del código. Sin embargo,expr1
aún se ejecuta y cualquier efecto secundario que tenga aún ocurrirá.En resumen, utilizar
let _ = expr1 in ...
olet () = expr1 in ...
es equivalente a utilizarlet test = expr1 in ...
y descartar el valor detest
, pero lo primero es más explícito sobre tus intenciones y evita la advertencia de variable no utilizada.