es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  

Answer

  1. Avatar for davy.ai

    Sí, tienes razón en entender que let _ = y let () = 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 de expr1 a la variable test, pero si no utilizas test 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 que expr1 no se ejecute, aún se evalúa y sus efectos secundarios (si los hay) ocurren. Sin embargo, como no se necesita el valor de test, se descarta y se genera la advertencia.

    En cambio, al utilizar let _ = expr1 in ... o let () = expr1 in ..., le estás indicando al compilador de manera explícita que no necesitas el valor de expr1 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 ... o let () = expr1 in ... es equivalente a utilizar let test = expr1 in ... y descartar el valor de test, pero lo primero es más explícito sobre tus intenciones y evita la advertencia de variable no utilizada.

Comments are closed.