Las funciones pueden combinarse para construir nuevas funciones. La composición aplica una función después de otra y permite modelar transformaciones encadenadas de datos.
Las funciones permiten transformar elementos de un conjunto en elementos de otro. Cuando tenemos varias funciones, podemos combinarlas para formar nuevas transformaciones.
La operación más importante en teoría de conjuntos es la composición de funciones. En programación, esta idea aparece al encadenar transformaciones, validaciones, filtros y conversiones.
Una función f: A → B asigna a cada elemento de A un único elemento de B.
El valor a pertenece al dominio y b pertenece al codominio.
Si tenemos dos funciones f: A → B y g: B → C, podemos componerlas para obtener una nueva función de A en C.
Primero se aplica f y luego se aplica g.
La composición g ∘ f se lee "g compuesta con f", pero se aplica de derecha a izquierda: primero f, después g.
En general, g ∘ f no es igual a f ∘ g.
Sean las funciones:
Entonces:
Los resultados son distintos, por eso el orden de composición importa.
Para que g ∘ f tenga sentido, las salidas de f deben poder usarse como entradas de g.
Si f produce valores fuera del dominio de g, la composición no está bien definida para todos los elementos.
Si las funciones se representan como relaciones, la composición conecta pares compatibles.
El valor intermedio debe coincidir: 1 va a a, y a va a x; por lo tanto 1 va a x.
La función identidad sobre un conjunto A asigna cada elemento a sí mismo.
Componer una función con la identidad no cambia la función.
Si f: A → B, entonces:
La identidad funciona como elemento neutro para la composición.
La composición de funciones es asociativa. Si las composiciones están bien definidas, la forma de agrupar no cambia el resultado.
Aunque la composición no sea conmutativa, sí es asociativa.
Una función inversa deshace el efecto de otra función. Para que una función tenga inversa como función, debe ser biyectiva.
Si f(a) = b, entonces f⁻¹(b) = a.
Cuando una función tiene inversa, componerla con su inversa produce una función identidad.
Esto expresa que una transformación y su inversa se cancelan mutuamente.
En JavaScript, la composición puede representarse creando una función que aplique dos funciones en secuencia.
function componer(g, f) {
return function (x) {
return g(f(x));
};
}
const sumarUno = x => x + 1;
const duplicar = x => x * 2;
const duplicarDespuesDeSumar = componer(duplicar, sumarUno);
console.log(duplicarDespuesDeSumar(3));
Primero se aplica sumarUno y después duplicar.
Si invertimos el orden de composición, el resultado puede cambiar.
function componer(g, f) {
return function (x) {
return g(f(x));
};
}
const sumarUno = x => x + 1;
const duplicar = x => x * 2;
const duplicarDespuesDeSumar = componer(duplicar, sumarUno);
const sumarDespuesDeDuplicar = componer(sumarUno, duplicar);
console.log(duplicarDespuesDeSumar(3));
console.log(sumarDespuesDeDuplicar(3));
Los resultados son 8 y 7, igual que en el ejemplo matemático.
Podemos componer una lista de funciones para crear una transformación más compleja.
const sumarUno = x => x + 1;
const duplicar = x => x * 2;
function componerVarias(...funciones) {
return function (valorInicial) {
return funciones.reduceRight((valor, funcion) => funcion(valor), valorInicial);
};
}
const convertirATexto = x => `Resultado: ${x}`;
const proceso = componerVarias(convertirATexto, duplicar, sumarUno);
console.log(proceso(3));
La composición se aplica de derecha a izquierda: primero sumarUno, luego duplicar y finalmente convertirATexto.
También podemos componer funciones representadas como relaciones de pares ordenados.
function componerRelaciones(g, f) {
return f.map(([entrada, intermedio]) => {
const par = g.find(([origen]) => origen === intermedio);
return [entrada, par[1]];
});
}
const f = [[1, "a"], [2, "b"]];
const g = [["a", "x"], ["b", "y"]];
console.log(componerRelaciones(g, f));
El resultado es la relación compuesta {(1, x), (2, y)}.
| Área | Composición | Ejemplo |
|---|---|---|
| Transformación de datos | Normalizar → validar → guardar | Procesar formularios |
| Interfaces | Evento → estado → vista | Actualizar una pantalla |
| Matemática | f seguida de g | g(f(x)) |
| APIs | Datos crudos → formato → respuesta | Preparar salida JSON |
| Seguridad | Entrada → hash → codificación | Transformaciones encadenadas |
La composición permite construir funciones complejas a partir de funciones simples. Es una herramienta fundamental para razonar sobre transformaciones matemáticas y procesos de programación.
En el próximo tema estudiaremos álgebra de conjuntos.