Composición de funciones (informática)
En ciencias de la computación, la composición de funciones es un acto o mecanismo para combinar funciones simples para construir otras más complicadas. Al igual que la función compuesta en matemáticas, el resultado de cada función se pasa como argumento de la siguiente, y el resultado de la última es el resultado del todo.
Frecuentemente se aplican funciones a los resultados de otras funciones siendo permitido por casi todos los lenguajes de programación. En algunos casos, la composición de funciones se puede usar como función por sí misma. Tal función siempre se puede definir, pero los lenguajes con función de primera clase lo hacen más fácil.
La capacidad de componer fácilmente funciones fomenta la modularización para mantener y reutilizar el código . En términos más generales, los grandes sistemas pueden construirse mediante la composición de programas.
La composición de funciones se aplica a las funciones que operan en una cantidad finita de datos, y cada paso se procesa secuencialmente. Las funciones que operan en datos potencialmente infinitos (codatos) se conocen como filtros y, en cambio, están conectadas en un flujo (pipeline), análoga a la composición de funciones y que puede ejecutarse simultáneamente .
Componer llamadas a funciones
[editar]Por ejemplo, supongamos que tenemos dos funciones f y g, como en z = f(y) & y = g(x) . Componerlos significa que primero calculamos y = g(x), y luego usamos y para calcular z = f(y) . Un ejemplo en Python:
def g(x):
#...
def f(y):
#...
y = g(x)
z = f(y)
Los pasos se pueden combinar:
z = f(g(x))
Estas dos implementaciones calculan el mismo resultado. La segunda implementación requiere solo una línea de código y se conoce coloquialmente como "altamente compuesto". La legibilidad y, por lo tanto, la capacidad de mantenimiento es una de sus ventajas, ya que requieren menos líneas de código, lo que minimiza el tamaño de un programa.[1] DeMarco y Lister verifican empíricamente una relación inversa entre el área superficial y la mantenibilidad.[2] Por otro lado, puede ser posible abusar de formas muy compuestas. Un anidamiento de demasiadas funciones puede tener el efecto contrario, haciendo que el código sea menos mantenible.
Nombrar composición de funciones
[editar]Supongamos que la combinación de llamar a f() en el resultado de g() es frecuentemente útil, y que queremos llamar foo() para que se use como una función por sí misma.
En la mayoría de los lenguajes, podemos definir una nueva función implementada por composición. Ejemplo en Python:
def foo(x):
return f(g(x))
Composición de primera clase
[editar]En los lenguajes de programación funcional, la composición de funciones se puede expresar naturalmente como una función u operador de orden superior . En otros lenguajes de programación, se puede escribir mecanismos propios para realizar la composición de funciones.
Véase también
[editar]Notas
[editar]- ↑ Cox (1986), pp. 15–17
- ↑ DeMarco y Lister (1995), pp. 133–135.
Referencias
[editar]- Abadi, Martín; Lamport, Leslie (1993), «Composing specifications», ACM Transactions on Programming Languages and Systems 15 (1): 73-132, doi:10.1145/151646.151649..
- Cox, Brad (1986), Object-oriented Programming, an Evolutionary Approach, Reading, MA: Addison-Wesley, ISBN 978-0-201-54834-1..
- Daume, Hal, III, Yet Another Haskell Tutorial..
- DeMarco, Tom; Lister, Tim (1995), «Software development: state of the art vs. state of the practice», en DeMarco, Tom, ed., Why Does Software Cost So Much, and other puzzles of the Information Age, New York, NY: Dorset House, ISBN 0-932633-34-X..
- van Gelder, Timothy; Port, Robert (1993), «Beyond symbolic: prolegomena to a Kama-Sutra of compositionality», en Honavar, Vasant; Uhr, Leonard, eds., Symbol Processing and Connectionist Models in Artificial Intelligence and Cognition: Steps Toward Integration, Academic Press..
- Gibbons, Jeremy (2002), Arbab, Farhad; Talcott, Carolyn, eds., Proc. 5th International Conference on Coordination Models and Languages, Lecture Notes in Computer Science 2315, Springer-Verlag, pp. 339-350, doi:10.1007/3-540-46000-4\_18..
- Korn, Henry; Liberi, Albert (1974), An Elementary Approach to Functions, New York, NY: McGraw-Hill, ISBN 0-07-035339-5..
- Kracht, Marcus (2001), «Strict compositionality and literal movement grammars», Proc. 3rd International Conference on Logical Aspects of Computational Linguistics, Lecture Notes in Computer Science 2014, Springer-Verlag, pp. 126-143, doi:10.1007/3-540-45738-0_8..
- Meyer, Bertrand (1988), Object-oriented Software Construction, New York, NY: Prentice Hall, pp. 13-15, ISBN 0-13-629049-3..
- Miller, George A. (1956), «The magical number seven, plus or minus two: some limits on our capacity for processing information», Psychological Review 63 (2): 81-97, PMID 13310704, doi:10.1037/h0043158, archivado desde el original el 19 de junio de 2010, consultado el 2 de mayo de 2010..
- Pierce, Benjamin C.; Turner, David N. (2000), «Pict: A programming language based on the pi-calculus», Proof, Language, and Interaction: Essays in Honour of Robin Milner, Foundations Of Computing Series, Cambridge, MA: MIT Press, pp. 455-494, ISBN 0-262-16188-5..
- Raymond, Eric S. (2003), «1.6.3 Rule of Composition: Design programs to be connected with other programs», The Art of Unix Programming, Addison-Wesley, pp. 15-16, ISBN 978-0-13-142901-7..
- Steele, Guy L., Jr. (1994), «Building interpreters by composing monads», Proc. 21st ACM Symposium on Principles of Programming Languages, pp. 472-492, doi:10.1145/174675.178068..