2009-05-15 8 views
21

Permítanme afirmar desde el principio que tengo una comprensión infantil de Mónadas. He leído los diversos hilos de las Mónadas aquí y he estudiado algunas horas sobre el concepto. Apenas me siento cómodo con el término, pero creo que es seguro decir que yo generalmente entiendo lo que es/hace una mónada.¿Cuál es el escenario convincente para el uso de Mónadas en C#

Soy un desarrollador de C# que busca mejorar mi forma de trabajar. Lo que me ayudaría más en mi Monaducación es ver una aplicación del mundo real de una Mónada en C# (es decir, a través de un linq SelectMany() o somesuch) que es claramente una mejora sobre otras formas de resolver el mismo tipo de problema en oldskool C#.

¿Alguien ha visto tal bestia?

+0

Además de ser una pregunta interesante, me gustó el término "Monaducación". –

+1

Estoy empezando a leer la programación ** Real World Functional de John Skeet/Tomas Petrecek ** http://www.amazon.com/Real-World-Functional-Programming-Examples/dp/1933988924/ref=sr_1_1?ie= UTF8 & s = books & qid = 1264373395 & sr = 8-1 que cubre provienen de este terreno. –

+1

el marco reactivo (http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx) es un buen ejemplo, me parece. –

Respuesta

11

Este es uno de los casos: desea crear una biblioteca de análisis (un buen ejemplo de una DSL incorporada) y descubrir que las mejores son bibliotecas de combinador de analizador monádico. Así que lo escribes aprovechando los azúcares de sintaxis LINQ para crear el código C# que tiene la misma estructura que la gramática del lenguaje que estás analizando, y obtienes los beneficios de un asombroso modelo de programación para el análisis semántico y la recuperación de errores sobre la marcha . Ver this blog para una descripción.

+0

+1: Estoy empezando a entender el lado pseudo-fluido del estilo monádico. Esto ayuda. Estoy empezando a conseguir que las mónadas logren varios objetivos complementarios, uno de los cuales es la legibilidad aumentada –

4

Aquí hay una de estas situaciones: desea escribir código que realice llamadas asincrónicas secuenciales (por ejemplo, IO) sin contener hilos, pero no desea escribir el enredo sin esperanza de espagueti que el modelo de programación asincrónico (BeginFoo/EndFoo) te obliga a entrar De modo que puede usar azúcares de mónada y LINQ y escribir código que se ve en línea recta, pero libera/cambia los hilos por todas partes. Ver this blog para una breve descripción.

0

LINQ se utiliza en muchas soluciones (y a menudo se solicitan en las preguntas) aquí en StackOverflow. Revise las preguntas con la etiqueta LINQ y verá el uso del mundo real.

+0

, mientras que es cierto que LINQ es monádico, hay diferencias significativas entre LINQ y, por ejemplo, una mónada IO() en Haskell que hacen que el uso de la mónada en C# unpure y tal vez no sea realmente la mejor ejemplificación de una mónada ...? Tal vez estoy confundido sobre las diferencias entre el uso de principios monádicos en un lenguaje puro vs. inpuro. –

3
+0

@all: esto se marcó como spam; pero en realidad este enlace * está * relacionado con la mónada. Una publicación específica podría haber sido mejor, pero no es OT. –

+0

No obtengo totalmente este ejemplo C# de usar un enfoque de mónada, pero es un código interesante en el ejemplo. Algo sobre lo que pensar. –

0

Programación con mónadas es declarativa, describiendo lo que desea a un nivel alto en lugar de los detalles de bajo nivel de cómo generarla.

Ver el exercises at the end de Brian Beckman's state-monad talk on Channel 9.

+0

gracias. eso fue útil pero no contrario a lo que dice Beckman, no es una gran explicación (o al menos no fue tan útil para mí) i/r/t uso práctico. –

5

Encuentra ternas pitagóricas:

var r = from a in Enumerable.Range(1, 25) 
      from b in Enumerable.Range(a, 25-a) 
      from c in Enumerable.Range(b, 25-b) 
      where a*a + b*b == c*c 
      select new [] { a, b, c }; 
+0

agradable. Estoy empezando a ver la relación entre las mónadas y el estilo funcional en general. este ejemplo es un buen ejemplo de ambos. –

0

I recently blogged sobre refactorización un mundo real típico código imperativo C# (una función en NuGet) al estilo funcional, monádico (más concretamente, mediante el Tal mónada). Hice todo lo posible para hacerlo en pequeños pasos, explicando el paso detrás racional, por lo que creo que ayuda a comprender cómo las mónadas son útiles.

3

Un ejemplo es la simplificación de las comprobaciones null utilizando la mónada Maybe tal como se muestra en this article.

Cuestiones relacionadas