¿Es la expresión de cálculo lo mismo que mónada?

22

Todavía estoy aprendiendo programación funcional (con f #) y recientemente comencé a leer sobre expresiones de cálculo. Todavía no entiendo completamente el concepto y una cosa que me mantiene inseguro al leer todos los artículos sobre mónadas (la mayoría de ellas están escritas en base a Haskell) es la relación entre las expresiones de cálculo y las mónadas.

Habiendo escrito todo eso, aquí está mi pregunta (dos preguntas en realidad):

¿Cada expresión de cálculo de F # es una mónada? ¿Se puede expresar cada mónada con la expresión de cálculo F #?

He leído esta publicación de Tomas Petricek y, si la entiendo bien, dice que las expresiones de cálculo son más que mónadas, pero no estoy seguro de interpretar esto correctamente.

Grzegorz Sławecki
fuente
@Raphael, ¿puedo preguntar cuál es la razón para eliminar la etiqueta lang?
Grzegorz Sławecki
2
Como nos preocupamos por los conceptos, tratamos de mantener la mayoría de las cosas independientes del lenguaje aquí. No sé qué hace la eliminación de F # a la pregunta ( creo que si es importante que sea F #, entonces la pregunta no es un tema aquí, pero es un caso límite), así que solo elimino la etiqueta F #. Regla general: F # no es un concepto de CS, por lo que no necesita una etiqueta. (Sí, conozco otras etiquetas PL y tampoco me gustan. Para algunas preguntas, la comunidad ha decidido que justifican estas etiquetas.)
Raphael
1
@Raphael Creo que la pregunta es un caso límite. Alguien decidió migrarlo aquí, pero parece que también está un poco fuera de tema. La pregunta en sí es una especie de computadora desde entonces, pero al mismo tiempo ambas respuestas y la pregunta están específicamente relacionadas con f #. Entiendo tu regla de oro, gracias por tu aclaración.
Grzegorz Sławecki

Respuestas:

22

En primer lugar, las expresiones de cálculo son una característica del lenguaje, mientras que las mónadas son abstracciones matemáticas, por lo que desde este punto de vista, son cosas completamente diferentes .

Pero esa no sería una respuesta muy útil :-). Las expresiones de computación son una característica del lenguaje que le brinda una sintaxis que se puede usar para programar con cálculos (o tipos de datos) que tienen la estructura monádica, pero también se pueden usar con otras estructuras. Puede leer mi documento de zoológico de expresión de cálculo F # para obtener más detalles, pero las expresiones de cálculo se pueden usar con:

  • Mónadas, pero también mónadas aditivas (lo que los Haskellers llaman MonadPluso MonadOr)
  • Cálculos compuestos (lo que Haskellers llama transformadores de mónada)
  • Cálculos que son monádicos, pero que admiten otras construcciones de F #, como el manejo de excepciones
  • Monoides (y un par de variaciones sin unión monádica)
  • Functores aplicativos (aunque esto solo se implementa en una extensión de investigación)

Por lo tanto, las expresiones de cálculo están ciertamente estrechamente vinculadas a las mónadas, pero no están estrechamente vinculadas a ellas. Esto está en contraste, por ejemplo, con la donotación de Haskell , que está mucho más vinculada a las mónadas (aunque incluso eso puede usarse con cálculos que no son estrictamente matemáticamente mónadas).

Tomás Petricek
fuente
3
Los transformadores de mónada son una forma genérica de convertir una mónada en otra mónada: las expresiones de cálculo de F # solo realmente admiten la implementación directa del / resultado / de esa transformación, en lugar de la transformación en sí.
GS - Pídele disculpas a Monica el
1
@GaneshSittampalam: Sí, tienes razón. Mi intento de simplificar no fue tan útil aquí :-). Las expresiones de cálculo pueden darle una sintaxis para trabajar con un cálculo que es el resultado de aplicar un transformador de mónada (con una sintaxis potencialmente diferente para la mónada subyacente y para la mónada compuesta)
Tomas Petricek
5

Puede usar expresiones de cálculo para expresar mónadas. Hay un ejemplo aquí . Además, como notó, puede usar expresiones de cálculo para mucho más que solo mónadas. Hay una explicación extendida sobre cómo son diferentes aquí . Aquí no hay espacio para explicar la diferencia correctamente, pero las expresiones de cálculo son diferentes de las mónadas en que reutilizan la sintaxis normal de F # y tienen la capacidad de agregar abstracciones adicionales. Una limitación es que no es idiomático (y difícil) escribir una expresión de cálculo que sea polimórfica sobre el tipo de cálculo.

N / A
fuente
1
Haga que su respuesta sea más autónoma al menos resumiendo el material en las páginas a las que enlaza. Su respuesta actual no tendrá ningún sentido si los dos enlaces dejan de funcionar.
David Richerby
2
No estoy seguro de lo que estás hablando. Respondí explícitamente las preguntas y luego di enlaces a más información si el autor de la pregunta está interesado. Los enlaces no son necesarios para responder la pregunta.
N_A
1
Ni siquiera puedo imaginar que los dos enlaces puedan dejar de funcionar :-)
Tomas Petricek