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 la resolución de sobrecarga de funciones , donde se selecciona una definición particular de una función que se 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 de tipo se pueden declarar opcionalmente, como: [1]
- función de especificación nombre_función ( tipo1 (), tipo2 (), ...) -> tipo_salida ().
Por ejemplo:
- especificación is_even ( número ()) -> booleano ().
Una firma de tipo en Haskell generalmente toma la siguiente forma:
nombreFunción :: arg1Type -> arg2Type -> ... -> argNType
Tenga en cuenta que el tipo del resultado puede considerarse como todo lo que esté más allá del primer argumento suministrado. Esto es una consecuencia de la currificación , que es posible gracias al soporte de Haskell para funciones de primera clase ; esta función requiere dos entradas donde se suministra un argumento y la función se "currifica" para producir una función para el argumento no suministrado. Por lo tanto, llamar a , donde , produce una nueva función que puede llamarse 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 . Por lo tanto, 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 de la siguiente manera:functionName :: (a -> a) -> a
Esta función toma una función con tipo firma y devuelve datos del tipo out.a -> a
a
En la máquina virtual Java , las firmas de tipos internas se utilizan para identificar métodos y clases a 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]
público estático void principal ( String [] args );
Y en el bytecode 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()
La firma de una función consta del prototipo de la función. Especifica la información general sobre la función, como el nombre, el alcance y los parámetros. Muchos lenguajes de programación utilizan la manipulación de nombres para pasar más información semántica de los compiladores a los enlazadores. Además de la manipulació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 de inmediato, pero a la que se puede acceder. [3]
Comprender el concepto 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 tener en cuenta las firmas de las funciones para evitar resultados impredecibles. La teoría de la informática, y en particular el concepto de polimorfismo , hacen un uso considerable del concepto de firma de función.
En el lenguaje de programación C , una firma es aproximadamente equivalente a su definición de prototipo .
En la familia de lenguajes de programación ML , "firma" se utiliza como palabra clave que hace referencia a una construcción del sistema de módulos que cumple el papel de una interfaz .
En programación informática , 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, los tipos y el orden de sus parámetros . [4] Una firma de 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 a la lista de parámetros, lo que se conoce como tipo de retorno final . La diferencia es solo 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 ( salida int suma , parámetros int [] valor ); [...] Agregar ( salida suma , 3 , 5 , 7 , 11 , - 1 ); // suma == 25
En Java , la firma de un método se compone de un nombre y del 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 los métodos sobrecargados (métodos con el mismo nombre) en una clase. Los tipos de retorno no se incluyen en la sobrecarga. Solo se deben utilizar las firmas de métodos para distinguir los métodos sobrecargados. [6]
Por ejemplo, los dos métodos siguientes tienen firmas diferentes:
void hacerAlgo ( Cadena [] x ); // hacerAlgo(Cadena[]) void hacerAlgo ( Cadenax ); // hacerAlgo(Cadena)
Los dos métodos siguientes tienen la misma firma:
int hacerAlgo ( int x ); // hacerAlgo(int) void hacerAlgo ( int y ) lanza Excepción ; // hacerAlgo(int)
En Julia , las firmas de funciones toman la siguiente forma:
comisión ( venta :: Int , tasa :: Float64 ) :: Float64
Los tipos en 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 en tiempo de ejecución si el tipo del valor no coincide con el tipo especificado.
Se permiten y se recomiendan los tipos abstractos para implementar un comportamiento general que sea 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 según corresponda.
comisión ( venta :: Entero , tasa :: Real ) :: Real
Los tipos son completamente opcionales en los argumentos de una función. Cuando no se especifican, es equivalente a utilizar el tipo Any, que es el supertipo de todos los tipos. Es idiomático especificar los tipos de argumentos, pero no el tipo de retorno.
En el lenguaje de programación Objective-C , las firmas de métodos de 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 (an 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 , tasa : f64 ) -> f64 ;
Es la combinación del nombre del método y la lista de parámetros.