En informática , una firma de tipo o anotación de tipo define las entradas y salidas de una función , subrutina o método . Una firma de tipo incluye el número, los tipos y el orden de los argumentos de la función . Un uso importante de una firma de tipo es para la resolución de sobrecarga de funciones , donde se selecciona una definición particular de una función a llamar entre muchas formas sobrecargadas.
En C y C++ , la firma de tipo se declara mediante lo que comúnmente se conoce como prototipo de función . En C/C++, una declaración de función refleja su uso ; por ejemplo, un puntero de función con la firma se llamaría así:(int)(char, double)
carácter c ; doble d ; int retVal = ( * fPtr )( c , d );
En Erlang , las firmas tipográficas se pueden declarar opcionalmente, como: [1]
- especificación nombre_función ( tipo1 (), tipo2 (), ...) -> tipo_salida ().
Por ejemplo:
- especificación es_even ( número ()) -> booleano ().
Una firma tipográfica en Haskell generalmente toma la siguiente forma:
nombre de función :: arg1Type -> arg2Type -> ... -> argNType
Observe que el tipo de resultado puede considerarse como todo lo que va más allá del primer argumento proporcionado. Esto es una consecuencia del curry , que es posible gracias al soporte de Haskell para funciones de primera clase ; esta función requiere dos entradas donde se proporciona un argumento y la función se "curva" para producir una función para el argumento no proporcionado. Por lo tanto, llamar a , donde , produce una nueva función que se puede llamar para producir .f x
f :: a -> b -> c
f2 :: b -> c
f2 b
c
Las especificaciones de tipo reales pueden consistir en un tipo real, como Integer
, o una variable de tipo general que se utiliza en funciones polimórficas paramétricas , como , o , o . Entonces podemos escribir algo como:a
b
anyType
functionName :: a -> a -> ... -> a
Dado que Haskell admite funciones de orden superior , las funciones se pueden pasar como argumentos. Esto se escribe como:functionName :: (a -> a) -> a
Esta función acepta una función con firma de tipo y devuelve datos de tipo out.a -> a
a
En la máquina virtual Java , las firmas de tipos internas se utilizan para identificar métodos y clases en el nivel del código de la máquina virtual.
Ejemplo: el método se representa en código de bytes como .String String.substring(int, int)
Ljava/lang/String.substring(II)Ljava/lang/String;
La firma del main
método se ve así: [2]
principal público estático vacío ( String [] args );
Y en el código de bytes desensamblado, toma la forma deLsome/package/Main/main:([Ljava/lang/String;)V
La firma del método main()
contiene tres modificadores:
public
Indica que el método puede ser llamado por cualquier objeto.main()
static
indica que el método es un método de clase.main()
void
indica que el método no tiene valor de retorno.main()
Una firma de función consta del prototipo de función. Especifica la información general sobre una función como el nombre, el alcance y los parámetros. Muchos lenguajes de programación utilizan la alteración de nombres para transmitir más información semántica de los compiladores a los enlazadores. Además de la alteración, hay un exceso de información en la firma de una función (almacenada internamente en la mayoría de los compiladores) que no está disponible fácilmente, pero a la que se puede acceder. [3]
Comprender la noción de firma de función es un concepto importante para todos los estudios de informática.
La práctica de la herencia múltiple requiere la consideración de las firmas de funciones para evitar resultados impredecibles. La teoría de la informática, y el concepto de polimorfismo en particular, hacen mucho uso del concepto de firma de función.
En el lenguaje de programación C , una firma es aproximadamente equivalente a la definición de su prototipo .
En la familia de lenguajes de programación ML , "firma" se utiliza como palabra clave que se refiere a una construcción del sistema de módulos que desempeña el papel de una interfaz .
En programación de computadoras , especialmente en programación orientada a objetos , un método se identifica comúnmente por su firma de método única , que generalmente incluye el nombre del método y el número, tipos y orden de sus parámetros . [4] La firma de un método es el tipo más pequeño de un método.
En C/C++, la firma del método es el nombre del método y el número y tipo de sus parámetros, pero es posible tener un último parámetro que consista en una matriz de valores:
int printf ( const char * , ... );
La manipulación de estos parámetros se puede realizar utilizando las rutinas en el encabezado de la biblioteca estándar .<stdarg.h>
En C++, el tipo de retorno también puede seguir la lista de parámetros, lo que se conoce como tipo de retorno final . La diferencia es sólo sintáctica; en cualquier caso, la firma resultante es idéntica:
auto printf ( const char * ... ) -> int ;
De manera similar a la sintaxis de C, las firmas de métodos en C# se componen de un nombre y el número y tipo de sus parámetros, donde el último parámetro puede ser una matriz de valores: [5]
void Agregar ( out int suma , params int [] valor ); [...] Sumar ( out suma , 3 , 5 , 7 , 11 , - 1 ); // suma == 25
En Java , la firma de un método se compone de un nombre y el número, tipo y orden de sus parámetros. Los tipos de retorno y las excepciones lanzadas no se consideran parte de la firma del método, ni tampoco los nombres de los parámetros; El compilador los ignora para verificar la unicidad del método.
Las firmas de métodos ayudan a distinguir métodos sobrecargados (métodos con el mismo nombre) en una clase. Los tipos de devolución no están incluidos en la sobrecarga. Sólo se deben utilizar firmas de métodos para distinguir los métodos sobrecargados. [6]
Por ejemplo, los dos métodos siguientes tienen firmas diferentes:
void hacer algo ( String [] x ); // hacerAlgo(Cadena[]) void hacerAlgo ( Cadena x ); // hacer algo (cadena)
Los dos métodos siguientes tienen la misma firma:
int hacer algo ( int x ); // hacerAlgo(int) void hacerAlgo ( int y ) lanza una Excepción ; // hacer algo(int)
En Julia , las firmas de funciones toman la siguiente forma:
comisión ( venta :: Int , tarifa :: Float64 ) :: Float64
Los tipos de los argumentos se utilizan para el envío múltiple . El tipo de retorno se valida cuando la función devuelve un valor y se genera una excepción de tiempo de ejecución si el tipo del valor no coincide con el tipo especificado.
Se permiten y recomiendan los tipos abstractos para implementar un comportamiento general que es común a todos los subtipos. Por lo tanto, la función anterior se puede reescribir de la siguiente manera. En este caso, la función puede aceptar cualquier subtipo Entero y Real en consecuencia.
comisión ( venta :: Entero , tasa :: Real ) :: Real
Los tipos son completamente opcionales en los argumentos de funciones. Cuando no se especifica, equivale a utilizar el tipo Cualquiera, que es el supertipo de todos los tipos. Es idiomático especificar tipos de argumentos pero no tipos de retorno.
En el lenguaje de programación Objective-C , las firmas de métodos para un objeto se declaran en el archivo de encabezado de la interfaz. Por ejemplo,
- ( id ) initWithInt: ( int ) valor ;
define un método initWithInt
que devuelve un objeto general (un id
) y toma un argumento entero. Objective-C solo requiere que un tipo en una firma sea explícito cuando el tipo no lo es id
; esta firma es equivalente:
- initWithInt: ( int ) valor ;
En Rust , las firmas de funciones toman la siguiente forma:
comisión fn ( venta : u32 , tarifa : f64 ) -> f64 ;
La firma de un método es parte de la declaración del método. Es la combinación del nombre del método y la lista de parámetros.