significado preestablecida percepcion mónada monadologia monadas monada leibniz espiritual dios armonia apeticion macros clojure monads

macros - preestablecida - mónada significado



En detalle, ¿cuándo debemos usar una mónada en lugar de una macro y viceversa? (3)

@khinsen y @mikera respondieron a la pregunta tan bien que es difícil hacer comentarios adicionales, pero creo que se perdieron un punto (o no lo pude encontrar en sus comentarios).

En Clojure las macros son parte del lenguaje. Úsalos o no, pero están ahí. De hecho, a menudo no tendrá más remedio que usarlas, ya que hacen que sus aplicaciones sean más idiomáticas (esa es una característica del uso profesional de cualquier idioma). Le permiten preprocesar las estructuras de datos que conforman la aplicación. Son similares a las construcciones de otros lenguajes en el sentido en que se incluyen independientemente de sus necesidades.

A diferencia de las macros, las mónadas no son parte de Clojure. Se construyen utilizando las construcciones del lenguaje, es decir, las macros. No se incluyen en el tiempo de ejecución a menos que insista en que estén allí. Para mí, las mónadas son patrones de diseño para componer cálculos y, por lo tanto, son similares a otros patrones de diseño con los que puede estar familiarizado. Utiliza patrones de diseño para desarrollar aplicaciones cohesivas y modulares, ya sea en mónadas o macros o en cualquier otro lenguaje que debas saber que existen y trabajar con ellas para tu bien.

En cuanto a su pregunta, las macros funcionan antes de que las monadas se activen. Las macros funcionan en la fase de compilación: cambian las estructuras de datos a otras estructuras de datos. Las mónadas son un patrón de diseño para componer cálculos. Esa es la diferencia. En Clojure, las mónadas se escriben utilizando macros (para facilitar su uso) y, por lo tanto, las personas tienden a decir qué se puede hacer con las mónadas que se podrían lograr fácilmente con macros. Eso es cierto, ya que sale del diseño de mónadas en Clojure, pero lo mismo podría decirse de las macros en sí. La mayoría de las veces no es necesario escribir nuevos, y la primera regla del macro club es no escribirlos en absoluto, pero aún son parte del idioma y usted debe estar muy al tanto de sus aplicaciones. .

Consulte ¿Cómo utilizan Macros los programadores de Clojure? para más discusión sobre macros.

Hay demasiados tutoriales en las mónadas que dicen ... "¡Mira! Este es un caso en el que podemos usar una mónada" o "Esto es para qué sirve una mónada". Lo que quiero saber es cuáles son algunos de los pasos que la gente usa para llegar a la conclusión de que pueden decirse a sí mismos: "¡Caramba! ¡Parece que podemos usar una mónada aquí!"

Entonces, cuando alguien me dice ... "(bla) no tiene nada que ver con una mónada ...", realmente no me ayuda a responder mi pregunta, que son:

  • ¿Cómo hago para determinar qué tipo de patrones en los programas podrían expresarse usando mónadas?
  • ¿Cómo puedo escribir mi propia mónada personalizada cuando he identificado el potencial para usarlos?

Comencé una pregunta muy larga aquí acerca de las mónadas si alguien está interesado en ayudar: Mapear y Reducir Mónada para Clojure ... ¿Qué pasa con una Mónada Juxt? .

De vuelta a esta pregunta:

¿Cuándo debemos usar una mónada en lugar de una macro y viceversa?

  • He leído artículos y he visto presentaciones que dicen ... ''Las mónadas se usan para la abstracción de DSL'' ... pero la mayoría de las bibliotecas de DSL de clojure (por ejemplo, hipo y korma) están usando defmacro y funciona bien.

¿Y por qué necesitamos mónadas en clojure si tenemos macros?


He estado usando Clojure durante dos años y la única vez que usé las mónadas fue como un ejercicio para demostrar que se podía hacer. Nunca los he necesitado para el código "real".

Las mónadas son mucho más comunes en Haskell porque:

  • Son la forma idiomática de manejar los cálculos de estado. En Clojure, normalmente se maneja el estado con referencias administradas , por lo que las mónadas no son tan necesarias en Clojure.
  • Del mismo modo, para IO: Clojure le permite hacer IO directamente sin declararlo en su tipo, por lo que no necesita la mónada IO.

Mi sugerencia sería centrarse en la programación funcional estándar en Clojure. A menos que veas que realmente necesitas mónadas, no invertiría demasiado tiempo en intentar traerlas.

Las macros son un problema ligeramente diferente: son para la generación de código en tiempo de compilación y las extensiones a la sintaxis del lenguaje (que pueden incluir DSL, aunque los DSL no necesariamente necesitan macros). Uso macros cuando se cumplen las dos condiciones siguientes:

  1. Quiero extender la sintaxis del idioma de manera que mejore significativamente mi capacidad para abordar un dominio de problema particular.
  2. No puedo obtener la misma funcionalidad con las funciones normales / composición de funciones. Las funciones normales deberían ser su primera opción si es posible: generalmente son más fáciles de escribir y mantener.

PD: si realmente estás interesado en las mónadas para Clojure, aquí hay dos videos que personalmente me parecen bastante buenos:


Las mónadas y las macros no tienen nada en común. Se utilizan para resolver diferentes problemas. En Clojure, la biblioteca de mónadas utiliza macros de forma bastante extensa para implementar la "interfaz de usuario" sintáctica en las mónadas. Puede usar mónadas para implementar funcionalmente algunas bibliotecas y luego agregar una capa de macros para la interfaz externa.

En cuanto a "cuándo se usarían las mónadas en Clojure", veo dos casos de uso:

1) Implementar cosas que tengan sentido en más de una mónada, para hacer el trabajo solo una vez y "enchufar" la mónada más tarde. Here hay una buena ilustración de este enfoque, aunque desafortunadamente (desde un punto de vista pedagógico) para una aplicación más bien no trivial: la programación lógica.

2) Implementar una técnica de composición que pueda formularse como una mónada, para beneficiarse de la infraestructura de mónada existente.

Clojure tiene dos mónadas incorporadas, "let" (mónada de identidad) y "para" (mónada de secuencia). Siempre que lo desee, puede insertar uno de ellos en su código más adelante, debe usar "domonad" en su lugar. Y cada vez que desees tener algo similar pero no exactamente igual, debes considerar escribir tu propia mónada.

Esto sigue siendo bastante abstracto, por desgracia. No hay muchos ejemplos de códigos pulidos y publicados que usen mónadas en Clojure en este momento. A medida que más Clojurianos se familiaricen con las mónadas y más expertos en mónadas (que generalmente provienen de Haskell) usan Clojure, es probable que esto cambie. He visto (pero no tengo a la mano) el análisis monádico realizado en Clojure, por ejemplo.