Argumentos para la programación funcional [cerrado]

10

Recientemente he estado aprendiendo F # por diversión (soy un desarrollador de VB.NET/C#), y realmente me gusta algo de lo que tiene para ofrecer. Teóricamente eso es. Pero tengo problemas para pensar en escenarios en los que elegiría codificar en F # en lugar de en C #. ¿Algunas ideas?

Se cayó el sistema
fuente
2
F#No es totalmente representativo de la programación funcional. Intenta en su Clojurelugar.
Trabajo
1
No sé F #, pero uso Haskell cada vez que quiero que me vuelvan loco. Trabajó todo el tiempo hasta ahora;)
1
infoq.com/presentations/Are-We-There-Yet-Rich-Hickey es un gran video sobre este tema (OO vs. Funcional)
mikera
¿Un lenguaje funcional dinámico? Puedes tener tantos como quieras. : P
Erik Reppen

Respuestas:

6

Tengo problemas para pensar en escenarios en los que elegiría codificar en F # en lugar de en C #. ¿Algunas ideas?

Desde aquí :

Servidores asincrónicos

  • Flujos de trabajo asincrónicos para el IO asincrónico.
  • Procesador de buzones para el paso de mensajes seguros para subprocesos.
  • Tipos de unión para el estado del servidor y el catálogo de mensajes.
  • Coincidencia de patrones y recursividad de cola para las máquinas de estado.

Metaprogramación (por ejemplo, análisis)

  • Generadores de analizadores como fslex y fsyacc.
  • Combinadores de analizador como FParsec.
  • Patrones activos para elegantes analizadores enrollados a mano.
  • Tipos de datos algebraicos para representar árboles de análisis.
  • Coincidencia de patrones para manipular árboles, por ejemplo, aplicar etapas de optimización.
  • Reflexión para la generación en tiempo de ejecución de código rápido.

Informática técnica

  • Funciones de orden superior para un código algorítmico elegante y rápido.
  • Tipos de datos algebraicos y coincidencia de patrones para manipulación simbólica.
  • Interoperabilidad para la riqueza de las bibliotecas .NET.
  • Interactividad usando F # interactive.
  • Expresiones de cálculo para masajear datos.
  • Unidades de medida para mejorar la corrección.

Aplicaciones GUI

  • Modelo como mensaje asíncrono que pasa entre el código de interfaz de usuario y el código lógico de la aplicación.
  • Las funciones de orden superior le permiten definir interfaces de usuario de forma declarativa.

Programación lógica

  • Colecciones persistentes para retroceder fácilmente.
  • La cola exige confiabilidad.
  • Generalización automática para una fácil programación genérica.

Pruebas

  • Ejecute pruebas unitarias de forma interactiva.
  • BDD significa escribir un intérprete.
  • Buen lenguaje de secuencias de comandos para escribir arneses de prueba y visualizar resultados.

Actuación

  • inline para abstracción de orden superior sin costo.
  • Tail requiere máquinas de estado rápidas.
  • Estructuras de datos puramente funcionales para baja latencia.
  • Metaprogramación para generación de código optimizado.
Jon Harrop
fuente
Admitiré que no sé F # o C #, pero sugeriría pasar unos días en F # y ver lo que piensas. En mi opinión, usar REPL es una gran victoria en cualquier idioma que lo admita
Zachary K
5

Esto es para lo que utiliza la programación de estilo funcional, más o menos a diario.

Hacemos muchas cosas estadísticas y actuariales con conjuntos de datos bastante grandes. Los datos que se obtienen de la base de datos son esencialmente objetos estáticos e inmutables. No hay razón para crear una clase con métodos.

Cada etapa del cálculo agrega algunos detalles adicionales, pero esencialmente no muta el objeto. Al "final" de la tubería, realmente estamos haciendo una reducción elegante para calcular sumas, recuentos y otras cosas.

Imagina esto.

for data in summarize( enrich( calculate( some_query( criteria() ) ) ) ):
    print data

Cada "fase" del cálculo es un bucle de programación funcional que realiza una simple lectura-cálculo-rendimiento y crea un objeto compuesto de otras cosas más resultados.

(Usamos Python, de ahí la programación funcional usando las funciones del generador).

Es más fácil usar objetos sin estado e inmutables.

S.Lott
fuente
¿Python tiene un equivalente a este F #? criteria() |> some_query |> calculate |> enrich |> summarizeEncuentro que el operador de la tubería de avance puede conducir a un código más claro, pero estoy divagando.
ChaosPandion
@ChaosPandion: Primero, esa sintaxis me confunde. Pero a algunas personas parece gustarles. Hay innumerables paquetes de Python. Estoy seguro de que podría buscar eso en SO y encontrar una respuesta.
S.Lott
@Chaos: No que yo sepa. usualmente compongo mappara obtener el mismo efecto.
Paul Nathan
4

Técnicamente, no es una propiedad única de una programación funcional, y F # no es un lenguaje funcional puro. F #, como uno de los descendientes de ML, proporciona una excelente coincidencia de patrones y tipos de datos algebraicos. Entonces, para cualquier tarea que requiera estructuras de datos complejas, F # es mucho más expresivo y fácil de usar que C #.

Imagine implementar un compilador en C # y F #: representar un árbol de sintaxis abstracta y transformarlo es mucho más simple si su lenguaje proporciona ADT y una coincidencia de patrones.

SK-logic
fuente
2

Ideal para el tipo de mapa reducido de multisistema masivo y paralelismo masivo multinúcleo. Bastante bueno, considerando que hoy en día los servidores de nivel de entrada vienen con 48 núcleos (96 contando HT).

vartec
fuente
2

Si quieres un funcionamiento completo, prueba Haskell, Erlang también tiene algunas cosas geniales al respecto.

Simon Payton-Jones dijo sobre Haskell, que quiere tener un programa que obviamente no tenga errores, en lugar de no tener errores obvios.

(Probablemente obtuve un poco la cita, pero entiendes la idea)

Al limitar los efectos secundarios, es mucho más fácil demostrar que su código es correcto.

Zachary K
fuente
1

Una ventaja definitiva es que es mucho más fácil de paralelizar.

biziclop
fuente
2
Estás hablando de pureza y una desventaja obvia es que la pureza tiende a hacer que los programas sean mucho más lentos. Entonces paralelo + puro no es necesariamente algo bueno.
Jon Harrop