significado significa que programacion preestablecida monadas monada leibniz genetica filosofia espiritual armonia haskell f# functional-programming

haskell - significa - monadas programacion



¿No es la mónada sólo un azúcar sintáctico? (6)

He pasado por varios artículos / artículos / blogs y lo que no es sobre Mónadas. La gente habla de ellos en diversos contextos, como la teoría de categorías (¿qué es eso del mundo?), Etc. Después de analizar todo esto y tratar de entender y escribir realmente el código monádico, llegué a la conclusión de que las mónadas son solo azúcar sintáctica (probablemente la más importante). glorificados de todos ellos). Ya sea en la notación de hacer en Haskell o en las expresiones de computación en F # o incluso en el LINQ, seleccione muchos operadores (recuerde que la sintaxis de LINQ también es un azúcar sintáctico en C # / VB).

Mi pregunta es si alguien cree que las mónadas son más que el azúcar sintáctico (sobre las llamadas de métodos anidados), por favor, ilumíneme con "practicidad" en lugar de "conceptos teóricos".

Gracias a todos.

ACTUALIZAR:

Después de analizar todas las respuestas, llegué a la conclusión de que la implementación del concepto de mónada en un lenguaje particular se basa en un concepto de azúcar sintáctico, PERO la mónada en sí misma no está relacionada con el azúcar sintáctica y es un concepto muy general o abstracto. Gracias a todos por la respuesta para dejar clara la diferencia entre el concepto en sí y las formas en que se implementa en los idiomas.


La mónada no es azúcar sintáctica; Haskell tiene algo de azúcar para tratar con las mónadas, pero puede usarlas sin el azúcar y los operadores. Por lo tanto, Haskell realmente no "soporta" las mónadas más que muchos otros lenguajes, solo hace que sean más fáciles de usar e implementar. Una mónada no es una construcción de programación, o una característica del lenguaje como tal; es una forma abstracta de pensar en ciertos tipos de objetos, que, cuando se intuyen como los tipos Haskell, proporcionan una buena forma de pensar acerca de la transferencia de estado en tipos que le permiten a Haskell (o cualquier lenguaje, cuando se piensa funcionalmente) hacer su trabajo. .


Las mónadas son azúcar sintáctica en el mismo sentido en que las clases y la sintaxis de llamada de método son azúcar sintáctica. Es útil y práctico, aunque un poco detallado, aplicar principios orientados a objetos a un lenguaje como C. Como las mónadas OO (y muchas otras características del lenguaje) son una idea, una forma de pensar acerca de cómo organizar sus programas.

El código monádico puede permitirle escribir la forma del código y, posteriormente, aplazar ciertas decisiones. Una mónada de registro, que podría ser una variante de Writer, podría usarse para escribir código para una biblioteca que admite el registro, pero deja que la aplicación consumidora decida dónde irá el registro, si es que está en alguna parte. Puede hacer esto sin azúcar sintáctica, o puede aprovecharla si el lenguaje en el que está trabajando lo admite.

Por supuesto, hay otras formas de obtener esta función, pero este es solo un ejemplo, con suerte "práctico".


No,

puedes pensar en una Mónada (o cualquier otra clase de tipos en Haskell) más en términos de un patrón. Ve un patrón y lo maneja cada vez de la misma manera, de modo que puede generalizarlo.

En este caso, es el patrón de información de valores agregados (o si te gustan los datos dentro de algún tipo de bolsas, pero esta imagen no es válida para cada mónada) y es una forma de encadenarlos bien.

El suggar sintáctico es solo una buena forma de componer los enlaces;) Es una extensión de la cosa;)

Para los conceptos prácticos: basta con ver los flujos de trabajo asíncronos, o la mónada IO, debería ser lo suficientemente práctico;)


Por definición, las mónadas no son azúcar sintáctica. Son un triple de operaciones (retorno / unidad, mapa y unión) sobre un universo de valores (listas, conjuntos, tipos de opciones, funciones con estado, continuaciones, etc.) que obedecen a un pequeño número de leyes. Como se usa en la programación, estas operaciones se expresan como funciones. En algunos casos, como Haskell, estas funciones se pueden expresar de forma polimórfica en todas las mónadas, mediante el uso de typeclasses. En otros casos, estas funciones deben recibir un nombre o espacio de nombres diferente para cada mónada. En algunos casos, como Haskell, hay una capa de azúcar sintáctica para hacer que la programación con estas funciones sea más transparente.

Así que las mónadas no se tratan de llamadas de función anidadas per se, y ciertamente no se trata de azúcar para ellas. Se trata de las tres funciones en sí, los tipos de valores sobre los que operan y las leyes a las que obedecen estas funciones.


Primero lo llamaría patrón, en el sentido de que ma -> (a -> mb) -> mb (con un comportamiento razonable) es conveniente para muchos constructores de problemas / tipos diferentes.

En realidad, tan conveniente que merece proporcionar un poco de azúcar sintáctica en el idioma. Esa es la notación de do en Haskell, from en C #, for comprensiones en scala. El azúcar sintético solo requiere adherencia a un patrón de denominación cuando se implementa ( selectMany en C #, flatMap en scala). Esos idiomas hacen eso sin que Monad sea un tipo en sus bibliotecas (en scala, uno puede estar escrito). Tenga en cuenta que C # hace eso para el patrón Iterator también. Si bien hay una interfaz IEnumerable, foreach se traduce en llamadas a GetEnumerator / MoveNext / Current según el nombre de los métodos, independientemente de los tipos. Solo cuando se realiza la traducción se verifica que todo esté definido y bien escrito.

Pero en Haskell (eso también se puede hacer en Scala u OCaml, no en C # y creo que esto tampoco es posible en F #), Monad es más que un patrón de diseño + azúcar sintética basada en un patrón de nombres. Es una API real, componente de software, lo que sea.

Considere el patrón de iterador en lenguajes imperativos (tipificados estáticamente). Solo puede implementar MoveNext / Current (o hasNext / next ) en las clases donde sea apropiado. Y si hay un poco de azúcar sintáctica como C # para eso, eso ya es bastante útil. Pero si lo convierte en una interfaz, inmediatamente puede hacer mucho más. Puedes tener cálculos que funcionen en cualquier iterador. Puede tener métodos de utilidades en iterador (buscar, filtrar, encadenar, anidar, etc.) haciéndolos más poderosos.

Cuando Monad es un tipo en lugar de solo un patrón, puede hacer lo mismo. Puede tener funciones de utilidades que hacen que trabajar con Monad sea más potente (en Control.Monad ) puede tener cálculos en los que el tipo de mónada a usar es un parámetro (consulte este article de Wadler que muestra cómo el intérprete puede ser parametrizado por el tipo de mónada). y lo que hacen varias instancias). Para tener un tipo de mónada (clase de tipo), necesita algún tipo de tipo de orden superior, es decir, debe ser capaz de parametrizar con un constructor de tipo, en lugar de un tipo de datos simple.


do notación, las expresiones de cálculo y las construcciones de lenguaje similares son, por supuesto, azúcar sintáctica. Esto es evidente ya que esas construcciones generalmente se definen en términos de lo que desugaron. Una mónada es simplemente un tipo que admite ciertas operaciones. En Haskell Monad es una clase de tipos que define esas operaciones.

Entonces, para responder a su pregunta: la Monad no es un azúcar sintáctico, es una clase tipográfica, sin embargo, la notación de ejecución es azúcar sintáctica (y, por supuesto, completamente opcional, puede usar las mónadas sin la notación).