2009-09-17 14 views

Respuesta

1

recursividad. Difícil de envolver su cabeza alrededor de ella, a veces

+5

De hecho. Consulte esta respuesta aquí: http://stackoverflow.com/questions/1438558/what-techniqie-in-functional-programming-is-difficult-to-learn-but-useful- after-wand/1438569#1438569 – skaffman

+0

laugh(); void laugh() {print ("ha"); risa(); } Aunque esto daría como resultado algo similar al nombre de este sitio con el tiempo; ^) – Toad

+0

No si su idioma es compatible con la recursividad de cola.;) – mipadi

6

yo diría First-class functions.

En informática, un lenguaje de programación se dice para apoyar funciones de primera clase (o función literales) si se trata funciones como objetos de primera clase. En concreto, esto significa que el lenguaje soporta la construcción de nuevas funciones durante la ejecución de un programa , almacenándolos en estructuras de datos, pasando como argumentos a otras funciones, y que regresan como los valores de otras funciones . Este concepto no cubre ningún medio externo al lenguaje y el programa (metaprogramación), como invocando un compilador o una función eval para crear una nueva función.

+0

¿Es útil? o_O –

+0

no solo útil sino poderoso. Por ejemplo, puede simular OOP incluso si el idioma no lo admite. Ver por ejemplo: http://javascript.crockford.com/prototypal.html –

+2

No es realmente difícil, en mi opinión ... Las mónadas son sin duda un orden de magnitud más difícil ... – em70

8

envolver mi cabeza alrededor de estilo que pasa continuación ha ayudado a mi javascript codificación de una gran cantidad

1

El concepto de funciones de orden superior, funciones lambda y el poder de los algoritmos genéricos que son fáciles de combinar me resultaron muy beneficiosos. Siempre estoy emocionado cuando veo lo que puedo hacer con un fold en haskell. Del mismo modo mi programación en C# ha cambiado mucho (para mejor, espero) ya que ingresé a la programación funcional (específicamente Haskell).

6

¿Desea medir la utilidad en relación con la programación funcional o la programación en general?

En general, la experiencia positiva de la programación funcional no resulta de técnicas particulares, sino de la forma en que cambia su forma de pensar -

  • el almacenamiento de datos inmutables
  • Formulación de forma declarativa (recursividad, de coincidencia de patrones)
  • funciones tratando como a los datos

así que diría que la programación funcional es la respuesta a su pregunta en sí misma.

Pero para dar una respuesta más concreta también, yo votaría por mecanismos de abstracción funcionales como

  • mónadas
  • arrows
  • de continuación pasa al estilo
  • zippers
  • de mayor order-functions
  • genéricos + clases de tipo.

Como ya se ha dicho, son muy abstractos cosas en la primera vista, pero una vez que ellos han entendido, que son técnicas muy interesantes y valiosos para escribir concisa, el error de fallos y por último pero no menos importante altamente código reutilizable.

Compare los siguientes (Pseudocódigo):

// Concrete 
def sumList(Data : List[Int]) = ... 

// Generic 
def sumGeneric[C : Collection[T], T : Num](Data : C) = ... 

Este último podría ser algo intuitivo en comparación con la primera definición, sino que le permite trabajar con cualquier colección y tipo numérico en general!

En general, muchos lenguajes modernos (principales) han descubierto tales beneficios e introducido características muy funcionales como funcionos lambda o Linq. Entender estas técnicas también mejorará el código de escritura en estos idiomas.

+0

Estoy de acuerdo con las primeras cinco sugerencias, pero la # 6 (genéricos) no es específica de los lenguajes de programación funcionales, incluso, p. Java admite parámetros de tipo con límites y, por lo tanto, podría expresar su sumaGeneric como se indica arriba. –

3

uno del Departamento "avanzada": Programación con los tipos de fantasmas (a veces también llamado tipo indexado). Ciertamente no es una técnica "estándar" en programación funcional, pero tampoco es totalmente esotérica, y es algo para mantener ocupado a su cerebro por un tiempo (usted solicitó algo difícil, ¿verdad?;)).

En pocas palabras, se trata de la parametrización de tipos para codificar y estáticamente hacer cumplir ciertas propiedades en tiempo de compilación. Uno de los ejemplos estándar es la función de adición de vectores que garantiza estáticamente que dados dos vectores de longitud N y M devolverán un vector de longitud N + M o de lo contrario obtendrás un error en tiempo de compilación. Sí, hay más aplicaciones interesantes.

Estas técnicas no son tan útiles en C++ como en un lenguaje de programación funcional adecuado, pero hasta ahora he logrado colar algunas de estas cosas en todos mis proyectos recientes en el trabajo en diferente grado, la mayoría recientemente en un contexto C++ EDSL donde funcionó muy bien. No necesariamente tiene que codificar cosas sofisticadas, aprender esto me ayudó a detectar situaciones en las que algunas etiquetas de tipo pueden reducir la verbosidad de un EDSL o permitir una sintaxis más limpia, por ejemplo.

Es cierto que la utilidad es un tanto limitado por el apoyo lenguaje y lo que estamos tratando de lograr.

Algunos entrantes:

Generic and Indexed Type (slides with some brief applications overview)

Fun with Phantom Types

El papel Kennedy y Russo se menciona en las diapositivas es Generalized Algebraic Data Types and Object Oriented Programming y pone algo de esto en el contexto de C#/Java.

El capítulo 3 en el libro Dave Abraham C++ Template Metaprogramming esy utiliza estas técnicas en C++ para el análisis dimensional.

Un proyecto práctico FP utilizando tipos fantasma es HaskellDB.

Cuestiones relacionadas