tags:

views:

746

answers:

6

Let me state up front that I have an infantile understanding of Monads. I have read the various threads on Monads here and have done a few hours of study on the concept. I hardly feel comfortable with the term, but I think it is safe to say that I generally understand what a Monad is/does.

I'm a C# developer who is looking to improve the way I work. What would help me further in my Monaducation is see a real world application of a Monad in C# (i.e. via a linq SelectMany() or somesuch) that is clearly an improvement over other ways of solving the same sort of problem in oldskool C#.

Has anyone seen such a beast?

+4  A: 

Here is one such scenario: you want to write code that makes sequential async calls (e.g. IO) without holding threads, but you don't want to write the hopeless tangle of spaghetti that the async programming model (BeginFoo/EndFoo) forces you into. So you can use a monad and LINQ sugars and write code that looks straight-line but it releases/switches threads throughout. See this blog for a short description.

Brian
+4  A: 

Here is one such scenario: you want to author a parsing library (a nice example of an embedded DSL), and you discover that the best ones are monadic parser combinator libraries. So you write it leveraging LINQ syntax sugars to author C# code that has the same structure as the grammar of the language you're parsing, and you get the benefits of an awesome programming model for on-the-fly semantic analysis and error-recovery. See this blog for a description.

Brian
+1: I'm starting to understand the pseudo-fluent side of the monadic style. This helps. I'm starting to get that monads accomplish several complementary goals, one of which is increased readability
Kevin Won
A: 

LINQ is used in many solutions (and often requested in questions) here on StackOverflow. Review questions with the LINQ tag and you will see real world usage.

Richard
while It's true that LINQ is monadic, there are significant differences between LINQ and, say, a IO() monad in Haskell that make the monad usage in C# unpure and maybe not really the best examplification of a monad...? Maybe I'm just confused on the differences between using monadic principles in a pure vs. inpure language?
Kevin Won
+2  A: 

check out http://memoirsofaprogrammer.blogspot.com

@all: this got flagged as spam; but actually this link *is* monad-related. A specific post might have been better, but it isn't OT.
Marc Gravell
A: 

Programming with monads is declarative, describing what you want at a high level rather than the low-level details of how to generate it.

See the exercises at the end of Brian Beckman's state-monad talk on Channel 9.

Greg Bacon
thanks. that was helpful but not contrary to what Beckman says, not al that great an explanation (or at least it wasn't that helpful to me) i/r/t practical usage.
Kevin Won
+2  A: 

Find Pythagorean triples:

  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 };
Greg Bacon
nice. I'm starting to see the relationship between monads and the functional style generally. this example is a good illustation of both.
Kevin Won