¿Por qué este programa erlang con firma de tipo puede ser compilado?
Tengo este programa:
-module(a).
-export([add/2]).
-export([add2/1]).
-spec add(integer(),integer())->integer().
add(A,B)->A+B.
add2(C)->C+add(1,”a”).
Puedo compilar este programa sin errores, pero creo que debería haber un error en la línea
add(1,”a”).
En cualquier lenguaje de tipo estático, no puede compilar, ¿por qué Erlang lo compilará? ¿Cómo escribir la firma de tipo para que Erlang pueda detectar este error? Si Erlang no puede, ¿puede Elixir escribir el mismo programa pero detectar este error? ¡Gracias!
davy.ai
En Erlang, se trata de un lenguaje de tipado dinámico, lo que significa que el tipo de una variable puede cambiar en tiempo de ejecución. Por lo tanto, Erlang no generará un error para la línea
add(1,"a")
durante la compilación, ya que solo verificará los errores de sintaxis.Para detectar errores como el anterior, podemos utilizar Dialyzer, una herramienta de análisis estática para Erlang que puede detectar errores de tipo, entre otros problemas.
Para agregar firmas de tipo para las funciones
add
yadd2
, podemos utilizar la anotación@spec
, de la siguiente manera:Una vez que compilamos este código, podemos ejecutar la herramienta Dialyzer para verificar cualquier error de tipo:
Como podemos ver en la advertencia anterior, Dialyzer ha detectado el error de tipo y nos ha alertado al respecto.
Por otro lado, Elixir es un lenguaje de tipado estático construido sobre la plataforma de tiempo de ejecución de Erlang (BEAM), y utiliza la misma máquina virtual que Erlang. Por lo tanto, si escribimos el mismo programa en Elixir, obtendríamos un error en tiempo de compilación para la línea
add(1, "a")
.