2008-10-18 12 views
20

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

+0

Es posible programar en un estilo funcional en muchos idiomas C#, C++, Python, Perl. Pero también hay idiomas funcionales (LISP, ML, etc.). Creo que a partir de su pregunta debemos centrarnos en las características funcionales en todas partes, no solo en los lenguajes funcionales ... – Cervo

+0

Está relacionado con Von Neuman y Church's Lambda – vrdhn

Respuesta

20

Yo diría que el punto de definición de la programación funcional pura es que todo el cálculo se realiza en funciones con no 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 me ocurrió 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 idiomas que generalmente se denominan 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).

+0

Agregaré que puede hacerlo en muchos lenguajes de programación comunes, no ust ErLang/otros lenguajes funcionales. Pero en pocas palabras esta es la definición. – Cervo

+1

Incorrecto. Te refieres a _pure_ FP. Hay casos de PF que no son libres de efectos secundarios. Está [combinando la taxonomía de FP versus de procedimiento, con IP frente a DP] (http://stackoverflow.com/questions/602444/what-is-functional-declarative-and-imperative-programming/8357604#8357604). –

+0

@ShelbyMooreIII Muchas personas (yo incluido) considerarían la programación funcional como un * subconjunto * de programación declarativa. La respuesta más votados en la pregunta que vincula estados así. Si considera la programación funcional como "programación con funciones matemáticas", la programación funcional es, por definición, declarativa, ya que las funciones matemáticas no pueden tener efectos secundarios. Si considera la "programación funcional" como "programación con funciones", entonces no significa mucho en mi humilde opinión. – Ben

-1

Es como dibujar una imagen mediante el uso de 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.

8

De wikipedia:

En informática, la programación funcional es un paradigma de programación que trata el cálculo como la evaluación de las funciones matemáticas y evita los datos del 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 da los siguientes beneficios:

  • 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.
  • Despliegue de código caliente en entornos de producción es mucho más fácil.
  • Los lenguajes funcionales se pueden razonar matemáticamente.
  • La evaluación diferida brinda la posibilidad de 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 here.

+2

Olvidó dos importantes beneficios derivados del aspecto central de los "efectos secundarios": la memorización y la paralelización se vuelven casi triviales, por lo que los proyectos de FP pueden alcanzar velocidades impresionantes (si recuerdo correctamente, la búsqueda de Google se implementó usando FP debido a estos razones) –

+0

Trivia - typo: 'Las funciones en FP pueden causar efectos secundarios' deberían tener 'nunca' en lugar de 'alguna vez', creo. –

3

Debo agregar que la programación funcional también tiende a abstraer las estructuras de control de su programa y del dominio, por ejemplo, ya no hace un ciclo 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.

-1

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 

por lo que el código se expresa 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 se puede pensar en todo tipo de abstracciones frías ...

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

Se puede crear (nota, muchos idiomas no permiten que usted pase + alrededor como una función pero parece que la manera más clara de expresar el concepto) ... .

AggregateItemsInList(List, combinefunction, StepFunction) 

funciones de incremento en los índices funcionan ... mejor sería hacer que funcionen en lista mediante operaciones de lista como siguiente y para incTwo siguiente siguiente si existe ....

function incNormal(x) { 
    return x + 1 
} 

function incTwo(x) { 
    return x + 2 
} 

AggregateItemsInList(List, +, incNormal) 

Want que hacer cada otro elemento?

AggegateItemsInList(List, +, incTwo) 

¿Quiere multiplicarse?

AggregateItemsInList(List, *, incNormal) 

¿Desea agregar los 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.

12

Muchas de las definiciones hasta ahora han enfatizado pureza, pero hay muchos lenguajes que se consideran funcionales que no son en absoluto 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 obtienes 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.

+1

Discutiría en contra de 2 porque la pregunta es acerca de la programación de funciones. Y puedes hacer esto en Python/Perl. El lenguaje es imperativo. Pero con las funciones map/filter/lamda/passing, puede programar en un estilo funcional. – Cervo

+1

if-then-else es un mal ejemplo, porque la mayoría de los lenguajes tienen una "expresión condicional". Python y Perl definitivamente tienen una distinción entre declaraciones y expresiones –

7

Ser capaz de enumerar las características es más útil que tratar de 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 a lo largo de un continuo, mientras que las características individuales definiciones individualmente más nítidas que están más universalmente de acuerdo.

A continuación se detallan 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 FP:

  • Pureza (aka inmutabilidad, evitando los efectos secundarios, referencial transparencia) funciones
  • de orden superior (por ejemplo, pasar una función como un parámetro, devolverlo como resultado, definir la función anónima sobre la marcha como una expresión lambda)
  • Laziness (a.k.a. no estricto evaluación, más útil/utilizable cuando se combina con pureza)
  • tipos de datos algebraicos y coincidencia de patrones
  • Cierres
  • currying/aplicación parcial
  • Polimorfismo paramétrico (aka genéricos)
  • recursividad (más prominentes, como resultado de la pureza)
  • Programación con expresiones en lugar de declaraciones (de nuevo, de la pureza)
  • ...

Las más características de los anteriores lista que está usando, 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") .

1

Hay dos definiciones separadas: (funciones de primera clase)

  • La definición más antigua que se ha dado por Chris Conway.

  • John Stauffer ha dado la definición más reciente (evitando los efectos secundarios como la mutación). Esto es más conocido como puramente programación funcional.

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

Cuestiones relacionadas