2009-07-06 10 views
10

He estado mirando las nuevas características en C++ 11 y realmente parece que será posible programar con un estilo de programación muy funcional. Me he acostumbrado a usar los tipos List, Seq, Array en F # y no veo ninguna razón por la cual sus miembros no puedan ser portados a algún tipo de plantilla de C++ 11. ¿Qué problemas o ventajas ves al usar C++ 11 frente a algo como F # para un estilo de programación funcional mixto? Tal vez los chicos de Boost hagan un nuevo functional una vez que salga C++ 11.Programación funcional en C++ 11, estilo F #

+3

La referencia que señala (Algoritmo STL, que no es una clase BTW) se trata de un encabezado que ya está presente y es estándar en C++. Es decir, nada nuevo. El nuevo estándar C++ simplemente facilita la creación de los funtores pasados ​​a los algoritmos ya existentes. –

+0

@dribeas cool, gracias – gradbot

Respuesta

15

El mayor problema al tratar de programar en un estilo funcional en C++ es que no admite la recursividad de cola. En un lenguaje funcional, no tienes que preocuparte por la explosión de la pila cuando colapsas recursivamente correctamente, pero en C++ siempre tienes que preocuparte por eso. Por lo tanto, muchos algoritmos de tipo "funcional" serán torpes o pesados.

+2

No es del todo cierto. La mayoría de los compiladores populares de C++ manejarán correctamente la recursividad final, aunque puede requerir que especifique indicadores de optimización adicionales como '-O2'. – Samee

+3

Esto es cierto. Independientemente de lo que un compilador pueda hacer como optimización, el lenguaje no proporciona facilidades para esta función, por lo que depender de ello es peligroso. – Christopher

+0

El problema es que RAII no es compatible con la optimización de la llamada de cola. El mismo problema existe en F # con try ... finalmente, pero es más obvio debido a lo explícito de la construcción. – Joh

0

Imagino que sería ... interesante ... implementar ciertas optimizaciones comunes a los lenguajes funcionales en C++ 0x (como la eliminación común de subexpresiones).

+0

La mayoría de los compiladores C y C++ hacen CSE y GCSE. Este no es el problema. El problema involucra la aplicación de funciones parciales y la recursión de cola. – Christopher

+0

OCaml no hace CSE. –

5

Usted puede encontrar este interesante:

http://smellegantcode.wordpress.com/2009/01/26/linq-to-c0x/

+0

Ooh, realmente interesante. Buen trabajo. – jalf

+0

¡Gracias! Un punto de partida para una implementación completa sería el rango de impulso y las bibliotecas de iteradores, alguna combinación de los dos. –

3

qué problemas de ventajas que percibe en el uso de C++ 0x vs algo así como f # para un estilo de programación funcional mixto?

¡El upward funarg problem, que se debatió en el contexto de Lisp hace 40 años!

5

Éstos son algunos de los problemas que encontré tratando de escribir código funcional en C#, mezclado con algunas golosinas de mi tiempo cuando todavía estaba usando C++:

  1. La falta de coincidencia de patrones. Una vez que te acostumbras, no tenerlo puede volverme loco.
  2. Falta de azúcar sintáctico para las tuplas.
  3. Falta de sintaxis para copiar registros y establecer campos de una vez.
  4. Falta de sintaxis para listas y matrices. Eso va para los constructores y la coincidencia de patrones.
  5. Sin GC y accesos de memoria inseguros. No estar limitado por un GC es una ventaja, pero recordar los informes que recibí de mis primeras versiones de Valgrind en código C++, pensé que estaba libre de errores, me asustaba para siempre.
  6. El código de la plantilla de comprensión no es exactamente accesible para todos los mortales. No tengo problemas para entender el mío, pero cada vez que buscaba implementaciones de STL, boost o cgal, me preguntaba qué idioma estaban usando. Mi C++ y su C++ no viven en el mismo mundo.
  7. La total falta de diversión al tratar con una biblioteca que usa otra versión de boost (o cualquier biblioteca que use plantillas).
  8. Verbosidad de archivos de cabecera/implementación por separado.
  9. La inferencia de tipo en C++ no llega tan lejos como, por ejemplo, F#. Sé que ha sido mejorado en C++ 11, pero según tengo entendido, es similar a var en C#, que no es suficiente una vez que probaste la inferencia estilo F #.
  10. Falta de expresiones de cálculo, incluidas las expresiones de secuencia, las comprensiones, asincrónicas ...

No me sorprendería si varios de estos puntos eran realmente posible en C++ usando alguna plantilla y el preprocesador magia, pero realmente no se puede utilizar estos en un entorno de producción a menos que tenga compañeros de trabajo muy aventureros y tolerantes .

Antes era entusiasta de C++. Luego comencé a usar programación genérica con plantillas y funciones de orden superior usando objetos de función. Simplemente era demasiado pesado para escribir. Después de probar un lenguaje funcional, nunca miré hacia atrás.

Cuestiones relacionadas