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.

¿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!

Tags:  ,

Answer

  1. Avatar for 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 y add2, podemos utilizar la anotación @spec, de la siguiente manera:

    -module(a).
    -export([add/2]).
    -export([add2/1]).
    
    -spec add(integer(), integer()) -> integer().
    add(A, B) -> A + B.
    
    -spec add2(integer()) -> integer().
    add2(C) -> C + add(1, "a").
    

    Una vez que compilamos este código, podemos ejecutar la herramienta Dialyzer para verificar cualquier error de tipo:

    $ dialyzer a.erl
      Proceeding with analysis...
      a.erl:7: The call a:add(1,'a') will never return since it differs in the 2nd argument from the success typing arguments: (integer(),integer())
      done in 0m0.38s
      done (warnings were emitted)
    

    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").

Comments are closed.