ventajas programacion orientada objetos logica funcional ejemplos desventajas functional-programming

functional programming - programacion - Punto de definición de la programación funcional



programacion funcional vs orientada a objetos (8)

Puedo enumerar muchas características de la programación funcional, pero cuando mi amigo me preguntó ¿Podrías definir la programación funcional para mí? No pude.


Debo agregar que la programación funcional también tiende a abstraer las estructuras de control de su programa, así como del dominio, por ejemplo, ya no hace un ''ciclo de bucle'' en una lista de cosas, sino que ''lo mapea'' con alguna función para producir La salida.

Creo que la programación funcional es un estado mental así como la definición dada anteriormente.


Es como dibujar una imagen usando vectores en lugar de mapas de bits: dígale al pintor cómo cambiar la imagen en lugar de cómo se ve la imagen en cada paso.

Es la aplicación de funciones en lugar de cambiar el estado.


Muchas de las definiciones hasta ahora han enfatizado la pureza , pero hay muchos lenguajes que se consideran funcionales que no son del todo puros (por ejemplo, ML, Scheme). Creo que las propiedades clave que hacen que un lenguaje sea "funcional" son:

  1. Funciones de orden superior. Las funciones son un tipo de datos integrado no diferente de enteros y booleanos. Las funciones anónimas son fáciles de crear e idiomáticas (por ejemplo, lambdas).
  2. Todo es una expresión. En los lenguajes imperativos, se hace una distinción entre enunciados, que mutan el estado y afectan el flujo de control, y las expresiones, que producen valores. En lenguajes funcionales (incluso lenguajes funcionales impuros), la evaluación de expresiones es la unidad fundamental de ejecución.

Dadas estas dos propiedades, naturalmente obtiene el comportamiento que consideramos funcional (por ejemplo, expresar cálculos en términos de pliegues y mapas). La eliminación del estado mutable es una forma de hacer que las cosas sean aún más funcionales.


De la wikipedia :

En informática, la programación funcional es un paradigma de programación que trata la computación como la evaluación de las funciones matemáticas y evita los datos de estado y mutables. Hace hincapié en la aplicación de funciones, en contraste con el estilo de programación imperativa que enfatiza los cambios de estado.

El uso de un enfoque funcional brinda los siguientes beneficios:

  • La programación concurrente es mucho más fácil en los lenguajes funcionales.
  • Las funciones en FP nunca pueden causar efectos secundarios, esto hace que las pruebas unitarias sean mucho más fáciles.
  • La implementación de código caliente en entornos de producción es mucho más fácil.
  • Los lenguajes funcionales pueden razonarse matemáticamente.
  • La evaluación diferida proporciona potencial para optimizar el rendimiento.
  • Más expresivos: cierres, emparejamientos de patrones, sistemas de tipos avanzados, etc. permiten a los programadores ''decir lo que quieren decir'' más fácilmente.
  • Brevedad: para algunas clases de programas, una solución funcional es significativamente más conciso.

Hay un gran artículo con más detalles aquí .


Yo diría que el punto definitorio de la programación funcional pura es que todo el cálculo se realiza en funciones sin efectos secundarios. Es decir, las funciones toman entradas y devuelven valores, pero no cambian ningún estado oculto. En este paradigma, las funciones modelan más de cerca a sus primos matemáticos.

Esto se definió para mí cuando comencé a jugar con Erlang, un lenguaje con una pila de escritura única. Sin embargo, se debe aclarar que existe una diferencia entre un paradigma de programación y un lenguaje de programación. Los lenguajes que generalmente se conocen como funcionales proporcionan una serie de características que fomentan o hacen cumplir el paradigma funcional (por ejemplo, Erlang con su pila de escritura única, funciones de orden superior, cierres, etc.). Sin embargo, el paradigma de programación funcional se puede aplicar en muchos idiomas (con distintos grados de dolor).


Ser capaz de enumerar las características es más útil que intentar definir el término en sí, ya que las personas usarán el término "programación funcional" en una variedad de contextos con muchos matices de significado en un continuo, mientras que las características individuales tienen definiciones más nítidas que están más universalmente de acuerdo.

A continuación se encuentran las características que vienen a la mente. La mayoría de las personas usa el término "programación funcional" para referirse a un subconjunto de esas características (las más comunes / importantes son "pureza" y "funciones de orden superior").

Características de FP:

  • Pureza (también conocida como inmutabilidad , evitar los efectos secundarios, transparencia referencial )
  • Funciones de orden superior (por ejemplo, pasar una función como parámetro, devolverla como resultado, definir la función anónima sobre la marcha como una expresión lambda)
  • Pereza (también conocida como evaluación no estricta , más útil / utilizable cuando se combina con la pureza)
  • Tipos de datos algebraicos y coincidencia de patrones
  • Cierres
  • Currying / aplicación parcial
  • Polimorfismo paramétrico (también conocido como genéricos )
  • Recursividad (más prominente como resultado de la pureza)
  • Programación con expresiones en lugar de declaraciones (nuevamente, desde pureza)
  • ...

Cuantas más funciones de la lista anterior esté utilizando, más probable es que alguien etiquete lo que está haciendo como "programación funcional" (y las dos primeras características, pureza y funciones de orden superior, probablemente valgan la mayor cantidad de puntos de bonificación extra hacia su "puntaje FP").


Hay dos definiciones separadas:

  • La definición anterior (funciones de primera clase) ha sido dada por Chris Conway.

  • La definición más nueva (evitar efectos secundarios como la mutación) ha sido dada por John Stauffer. Esto se conoce más generalmente como programación puramente funcional.

Esta es una fuente de mucha confusión ...


Creo que John Stauffer principalmente tiene la definición. También agregaría que necesitas poder pasar funciones. Esencialmente necesitas funciones de orden alto, lo que significa que puedes pasar funciones fácilmente (aunque pasar bloqueos es lo suficientemente bueno).

Por ejemplo, una llamada funcional muy popular es el mapa. Es básicamente equivalente a

list is some list of items OutList is some empty list foreach item in list OutList.append(function(item)) return OutList

para que el código se exprese como mapa (función, lista). El concepto revolucionario es que la función es una función. Javascript es un excelente ejemplo de un lenguaje con funciones de alto orden. Básicamente, las funciones se pueden tratar como una variable y pasar a funciones o regresar de funciones. C ++ y C tienen indicadores de función que se pueden usar de manera similar. Los delegados .NET también se pueden usar de manera similar.

entonces puedes pensar en todo tipo de abstracciones geniales ...

¿Tiene una función AddItemsInList, MultiplyItemsInList, etc.?
Cada función toma (Lista) y devuelve un solo resultado

Podrías crear (ten en cuenta que muchos idiomas no te permiten pasar como una función, pero parece ser la manera más clara de expresar el concepto) ...

AggregateItemsInList(List, combinefunction, StepFunction)

Las funciones de incremento funcionan en índices ... mejor sería hacer que funcionen en la lista usando las operaciones de lista como siguiente y para incTwo siguiente si existe ....

function incNormal(x) { return x + 1 } function incTwo(x) { return x + 2 } AggregateItemsInList(List, +, incNormal)

¿Quieres hacer cualquier otro artículo?

AggegateItemsInList(List, +, incTwo)

¿Quieres multiplicar?

AggregateItemsInList(List, *, incNormal)

¿Quieres agregar puntajes de exámenes juntos?

function AddScores (studenta, studentb) { return studenta.score + studentb.score } AggregateItemsInList(ListOfStudents, AddScores, incOne)

Las funciones de alto orden son una abstracción muy poderosa. En lugar de tener que escribir métodos personalizados para números, cadenas, estudiantes, etc., tiene un método agregado que recorre una lista de todo y solo tiene que crear la operación de adición para cada tipo de datos.