Librería <Functional>
Provee varios objetos funcionales, diseñados para ser
utilizados porlos algoritmos estándares.
Objetos Funcionales
Un objeto de función es una programación de computadoras que
permite construir un objeto que se invoque o llama como si se tratara de un
ordinario función , por lo general con la misma sintaxis (un parámetro de
función, que también puede ser una función).
Descripción
Un uso típico de un objeto de función es por escrito de
devolución de llamada funciones. Una devolución de llamada en lenguas de
procedimiento , tales como C , se puede realizar mediante el uso de punteros a
funciones . Sin embargo, puede ser difícil o incómodo para pasar un estado
dentro o fuera de la función de devolución de llamada. Esta restricción también
inhibe el comportamiento más dinámico de la función. Un objeto de la función
resuelve esos problemas ya que la función es en realidad una fachada para un
objeto completo, llevando su propio estado.
Muchas lenguas modernas (y algunos más), por ejemplo, C + +
, Groovy , Lisp , Perl , PHP , Python , Rubí , Scala , y muchos otros, apoyan
la función de primera clase deobjetos, e incluso pueden hacer un uso
significativo de ellos. La programación funcional idiomas además apoyan el
cierre , es decir, las funciones de primer nivel que pueden "cerrarse
sobre 'las variables de su entorno en el momento de la creación. Durante la
compilación, una transformación conocida como lambda levantamiento convierte
los cierres en objetos funcionales.
Ejemplo:
Consideremos el ejemplo de una rutina de clasificación que
utiliza una función de devolución de llamada para definir una relación de orden
entre un par de artículos. Un programa en C utilizando punteros de función
puede aparecer como:
/ * La función de devolución de llamada, devuelve <0 si a <b,> 0 si a> b, 0 si a == b * / int compareInts ( const void * a , const void * b ) { retorno * ( const int * ) una - * ( const int * ) b ; } ... / / Prototipo de qsort es / / void qsort (void * base, size_t nel, ancho size_t, int (* compar) (const void *, const void *)); ... int main(void) { int items[] = { 4, 3, 1, 2 }; qsort(items, sizeof(items) / sizeof(items[0]), sizeof(items[0]), compareInts); return 0; }
En C + + un objeto de función puede ser utilizada en lugar
de una función ordinaria mediante la definición de una clase que sobrecarga la
función de operador de llamada mediante la definición de un operador () función
miembro. En C + + esto se llama un tipo de funtor clase , y puede aparecer de
la siguiente manera
struct IntComparator { bool operador ( ) ( const int y un const int y b ) const { volverá a < b ; } } ; ... / / Una sobrecarga de std :: sort es: template < clase RandomIt, clase Compara > void ordenar ( RandomIt primero, RandomIt pasado, Compara borrador ) ; ... int principal ( ) { std :: vector < int > artículos { 4 , 3 , 1 , 2 } ; std :: sort ( . elementos comenzar ( ) ., artículos finales ( ) , IntComparator ( ) ) ; vuelta 0 ; }
Observe que la sintaxis para proporcionar la devolución de
llamada para los sortInts () función es idéntica, sino un objeto se pasa en
lugar de un puntero a función. Cuando se invoca la función de devolución de llamada
se ejecuta como cualquier otro miembro de la función, por lo que tiene acceso
completo a los demás miembros (datos o funciones) del objeto.
Es posible utilizar objetos de función en situaciones
distintas a las funciones de devolución de llamada (aunque el reducido plazo
funtor normalmente no se utiliza). Continuando con el ejemplo,
bool resultado = cpm ( a, b ) ;
Además de funtores tipo de clase, otros tipos de objetos de
función también son posibles en C + +. Ellos pueden tomar ventaja de C + + de
este miembro y agujas, o plantilla delas instalaciones. La expresividad de
plantillas permite que algunos de programación funcional técnicas que se
utilizarán, como la definición de los objetos de función en términos de otros
objetos de función (como la composición de la función ). Gran parte de la C + +
Biblioteca de plantillas estándar (STL) hace un uso intensivo de los objetos
funcionales basados en plantillas.
C + 11 permite definir la función anónimos objetos. La línea
del ejemplo anterior se podría escribir de la siguiente manera:
sortInts ( . artículos comienzan ( ) ., artículos finales ( ) , [ ] ( int a, int b ) { retorno a < b ; } ) ;
No hay comentarios:
Publicar un comentario