¿Cuáles son algunas buenas prácticas cuando se trata de enseñar programación declarativa a programadores imperativos?


13

Me ofrecí a entrenar un poco en F # en mi empresa y parecían mostrar cierto interés. Generalmente son programadores de VB6 y C # que no siguen la programación con demasiada pasión. Dicho esto, siento que es más fácil escribir el código correcto cuando piensas en un asunto funcional, por lo que definitivamente deberían obtener algún beneficio.

¿Alguien puede ofrecer algún consejo sobre cómo debería abordar esto?

Ideas

  • No se concentre en la sintaxis, sino en cómo se puede usar este lenguaje y los modismos que promueve.
  • Intente y piense en ejemplos que son difíciles de escribir de manera imperativa pero que se traducen en códigos elegantes cuando se escriben de manera declarativa.

F # y programación declarativa ?????
P Shved

@Pavel - ¿Es una pregunta?
ChaosPandion

3
@Pavel - OK, ¿quieres explicar por qué hiciste la declaración? Esta es la segunda vez que haces comentarios extremadamente vagos. Es muy grosero.
ChaosPandion

3
en.wikipedia.org/wiki/Declarative_programming La programación funcional es un tipo de programación declarativa. Además, +1, buena pregunta.
Nota para uno mismo - piense en un nombre

2
@Chaos, en mi opinión, F # no admite el paradigma de programación declarativa. Su evaluación entusiasta y sus características imperativas hacen que el lenguaje sea meramente una forma conveniente y funcional de denotar las mismas declaraciones imperativas que usa en, digamos, C #. ¡Vamos, incluso makees más un lenguaje declarativo que F # o Caml! (Irónicamente, esto hace que su trabajo sea más fácil.)
P Shved

Respuestas:


5

La programación funcional es una bestia extraña para mí. Aprendí F # y Haskell, escribí algunos programas simples y me encanta usarlos, pero nunca tuve el "destello de revelación" del que algunas personas hablan. Pero lentamente, me di cuenta de que cada vez escribía más código que debía ser inmutable, dividiendo las tareas en más, funciones más pequeñas e intentando usar mucho más a los delegados. Es algo que, si te gusta, se desliza en tu trabajo porque el valor de esas técnicas es evidente.

Ahora, más prácticamente para el entrenamiento: encuentro que dos conceptos realmente hacen clic en Programación funcional como un estilo para mí.

Primero, el estilo FP se basa en la estructura de datos, no en la composición como en OOP. Miré algo como Lista en C # como un truco inteligente para generar listas seguras de tipo, algo que compuso el tipo (cadena) en el otro tipo (lista). Después de aprender FP, miro genéricos más como Monads ahora. La lista es una forma estructurada que puede tomar el código, y decora las cadenas.

En segundo lugar, y quizás más útil para los programadores de C # / ASP, es la idea de que FP funciona en la recursión y la repetición, mientras que OOP funciona en la mutabilidad y el bucle. Ahora tiendo a pensar en el ciclo de vida de la página ASP como una especie de FP: cada solicitud se procesa desde cero a lo largo de todo el ciclo de vida, por lo que toda la página es, en efecto, un gran programa que se repite lentamente. Si puede reducir esa noción, obtendrá una mejor idea de cómo se puede estructurar un programa imperativo alrededor de bucles de funciones que toman datos, operan sobre ellos y devuelven datos nuevos en lugar de modificar los antiguos.

El obstáculo más difícil, al menos para mí, para superar con este enfoque es esa sensación de hundimiento de que estás desperdiciando toneladas de recursos cuando usas objetos mutables ahorrarías una tonelada de memoria. En GC confiamos, y solo tuve que aprender a dejar de lado las preocupaciones de rendimiento hasta que realmente vi que el programa se ejecutaba y verificaba si había alguno, y de ser así, usar un generador de perfiles para ver exactamente dónde estaban los problemas.



1

Muchos lenguajes de programación imperativos (Ada, C / C ++, Turbo Pascal, FoxPro) tienen la capacidad de definir punteros a funciones o literales de nombre de procedimiento que pueden evaluarse (y los procedimientos nombrados después del literal invocado) en tiempo de ejecución.

El ejemplo tradicional es qsort en C. Construye sobre esa noción de que puedes definir algoritmos que ejecutan otros algoritmos en estructuras de datos. Obviamente, esto es solo una fracción de lo que es la programación funcional. Pero he descubierto que este es un buen punto de partida para que la idea se hunda.

Una vez que se hunde, puede comenzar a profundizar en otras cosas (inmutabilidad, compartir nada, etc.)


Corrección: lo que quiero decir es construir sobre la noción de que puedes definir algoritmos parametrizados que pueden tomar OTROS algoritmos como parámetros y ejecutarlos en estructuras de datos.
luis.espinal

1

¿Alguien puede ofrecer algún consejo sobre cómo debería abordar esto?

Seguro:

  • Elija sus ejemplos cuidadosamente para que su código F # no solo resuelva un problema de manera elegante, sino que también sea mucho más elegante de lo que es posible con C # / VB . La coincidencia de patrones y la inferencia de tipos son tus amigos aquí.

  • Use un ejemplo para resaltar los beneficios de la nueva función que se encuentra en F #, por ejemplo, flujos de trabajo asincrónicos, patrones activos.

  • No tenga miedo de dar ejemplos impuros utilizando estructuras de datos mutables cuando sea apropiado. F # es impuro por una razón.

  • No presente F # como una panacea. Describa las aplicaciones para las cuales F # no es adecuado, así como aquellas para las que es mucho más adecuado que otros lenguajes .NET.

  • Señale las muestras de juguetes que pueden estudiar, así como los proyectos exitosos del mundo real que usaron F # (Bing AdCenter, Halo 3, etc.).

  • Explique todo en términos de cómo F # puede ayudarlos a resolver problemas más fácilmente. Evita los debates religiosos. Manténgase positivo sobre F #, no negativo sobre otros idiomas. Ármalos con hechos y evidencia, pero déjalos sacar sus propias conclusiones.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.