functional programming - programacion - ¿Son buenos los lenguajes de programación funcionales para tareas prácticas?
programacion funcional vs orientada a objetos (9)
¿Alguien tiene ejemplos de lenguajes funcionales que sean excelentes para realizar tareas prácticas o tareas prácticas que se realicen mejor con lenguajes funcionales?
Nuestro negocio funciona con el código F #, para todo, desde transacciones con tarjeta de crédito en línea hasta análisis web. Estas aplicaciones LOB están compuestas de minúsculos scripts F # que hacen todo lo que se requiere de forma rápida y sencilla mediante el uso de la interoperabilidad y automatización sin problemas de aplicaciones como Outlook y Excel .NET.
Nuestro negocio obtiene la mayor parte de su dinero vendiendo software escrito en F # que resuelve problemas prácticos a clientes de muchos sectores, desde software integrado para equipos médicos hasta proveedores de servicios de Internet marítimos.
Desde mi experiencia con Haskell, Erlang y Scheme, me parece que los lenguajes de programación funcionales son una manera fantástica de responder preguntas científicas. Por ejemplo, tomar un pequeño conjunto de datos y realizar un análisis extenso en él para devolver una respuesta significativa. Es genial para resolver algunas preguntas difíciles del Proyecto Euler o para probar el Google Code Jam de una manera original.
Al mismo tiempo, parece que, por su propia naturaleza, son más adecuados para encontrar soluciones analíticas que para realizar tareas prácticas. Noté esto con más fuerza en Haskell, donde todo se evalúa perezosamente y todo su programa se reduce a una solución analítica gigante para algunos datos dados, ya sea que incluyan el código en el programa o se incorporen a través de las limitadas capacidades IO de Haskell.
Básicamente, las tareas que yo llamaría "prácticas" como
Aceept a request, find and process requested data, and return it formatted as needed
Parece que se traducen mucho más directamente a los lenguajes de procedimiento. La mayor suerte que he tenido al encontrar un lenguaje funcional que funcione así es Factor, que compararía con una versión de Python con notación polaca inversa.
Así que solo tengo curiosidad por saber si me he perdido algo en estos idiomas o si no me gusta la forma en que hago esta pregunta. ¿Alguien tiene ejemplos de lenguajes funcionales que sean excelentes para realizar tareas prácticas o tareas prácticas que se realicen mejor con lenguajes funcionales?
Básicamente, las tareas que yo llamaría "prácticas" como
Reciba una solicitud, busque y procese los datos solicitados y devuélvalos formateados según sea necesario
¿Experimentaste con Erlang y no pudiste encontrar una tarea práctica bajo esta descripción de práctica?
Aceptar una solicitud.
Quieres decir como receive
. O simplemente ser llamado directamente como una función.
Encontrar y procesar los datos solicitados.
No estoy completamente seguro de lo que quiere decir aquí, pero para encontrar datos hay E / S de archivos, E / S de redes, comunicación entre procesos (distribuida), etc. etc. Para encontrar subconjuntos de esos datos hay expresiones regulares, coincidencia de patrones, etc.
Para el procesamiento hay un montón de cosas para cadenas, listas, matemáticas, conjuntos, gráficos, etc. ¿No es esto suficiente para el procesamiento? ¿Qué más estás buscando?
Devuélvalo formateado según sea necesario.
Puedo devolver los datos resultantes como átomos, listas, blobs binarios, cadenas formateadas, números, etc. ¿Qué le faltó a Erlang a este respecto? Estoy realmente sinceramente confundido aquí.
¿Alguna vez has usado LINQ?
Si es así, felicitaciones. Has utilizado un lenguaje funcional en un contexto práctico. De esto se trata el desarrollo funcional.
Y sí, F # es MUY útil.
Con respecto a los idiomas, creo que F # es un ejemplo de lenguajes que son principalmente ''funcionales'' pero también ''prácticos''. Scala y Clojure son probablemente otros en esta categoría.
(Al ir un nivel más profundo, creo que la ''fórmula para el éxito'' aquí es un lenguaje que se inclina fuertemente hacia ''funcional'', pero tiene acceso a vastas bibliotecas prácticas (por ejemplo, .Net / JVM / alguna C FFI) y tiene buenas herramientas (por ejemplo, Soporte IDE).
Al menos de alguna manera estoy de acuerdo con la premisa implícita de la pregunta, a saber, que existe una tensión entre ''poder analítico conciso / bello'' y ''pragmática''.
En mi opinión, el esquema es demasiado minimalista para ser práctico, se utiliza en varios cursos para la enseñanza (ver Estructura e interpretación de programas de computadora). Sin embargo, los lenguajes Lisp modernos como Common Lisp, y especialmente Clojure están ganando importancia. Erlang es utilizado por varias industrias grandes para aplicaciones de alta concurrencia, y personalmente no lo he visto ser utilizado por los programadores de usuarios finales. Haskell, por otro lado, es un lenguaje del mundo real, y se ha utilizado para escribir un montón de software maravilloso, incluyendo:
- XMonad es un administrador de ventanas del sistema X Window escrito únicamente en Haskell.
- Leksah, un IDE para Haskell está escrito en el mismo Haskell.
- Pugs, una de las implementaciones líderes de Perl 6 está escrito en Haskell.
- Por último, el Haskell Compiler de Glasgow está escrito en Haskell.
Erlang es bien conocido por su robustez y características para escribir servidores altamente concurrentes.
También tiene un DBMS de fábrica.
Es gracioso, tú y yo tenemos nociones muy diferentes de "tareas prácticas". Usted dice que es:
Reciba una solicitud, busque y procese los datos solicitados y devuélvalos formateados según sea necesario
Esto es más o menos lo que está hecho para un lenguaje funcional: funciones que toman datos y devuelven datos nuevos sin preservar ningún estado entre llamadas (es decir, sin efectos secundarios). Esto es lo que tienes aquí y también se llama tubería.
Ahora esto no es lo que yo llamaría una tarea práctica. En los programas modernos, tiene que lidiar con GUI, funciones multiproceso y E / S de red. Todos estos tienen el estado que se requiere para mantener los datos entre las llamadas de función. Los datos no se canalizan a una función y el resultado se canaliza, las funciones también afectan al estado "global".
Y es esta definición de "tarea práctica" donde los programas funcionales comienzan a fallar. Escribir una GUI en un programa funcional es prácticamente imposible si no usa sus extensiones imperativas, por ejemplo.
Entonces, en conclusión, la respuesta que está pidiendo es un sincero sí, los programas funcionales están a la altura de la tarea. Sin embargo, la respuesta que realmente estás buscando es que es un poco más complicado que eso.
No estoy seguro sobre la definición de ''Tareas prácticas'' y a qué se refiere. pero en otras palabras, creo que se trata de resolver problemas mediante algoritmos que deben estar representados por un lenguaje de programación. si es así, el lenguaje funcional es muy útil y práctico. Especialmente cuando tiene límites en el tiempo para encontrar la solución e implementarla. para mí, sigo usando lenguajes no funcionales cuando participo en la resolución de concursos algorítmicos complejos como Google CodeJam . Estoy planeando aprender un lenguaje funcional que sea mejor para mí para este tipo de tareas o problemas.