Live data from Hacker News

Monads Explained Quickly

breck-mckye.com

31–40 of 42 posts

Re: Monads Explained Quickly

#31
post #20
post #17

Earlier quoted context omitted.

At risk of adding to the pile of half baked pedagogy, here's my take at why they're useful. The operation to chain things together (denoted >>= and pronounced bind) in the Maybe monad has type Maybe a -> (a -> Maybe b) -> Maybe b In a more a java-like notation, this is like Maybe bind(Maybe , Function >) The Haskell notation says that it's a function that takes two arguments (separated by ->). The first argument (May…

I really have to thank you for this comment. I had serious trouble understanding Haskell's type notation, and translating it to Java-ish was immensely helpful.

These are some tangible explanations of Maybe monad in C#. Was helpful for me to understand, and now using some the concepts in my projects.

http://www.codeproject.com/Articles/109026/Chained-null-chec...

Re: Monads Explained Quickly

#32
I see monad tutorial after monad tutorial posted here, but never some new, awesome piece of technology produced using Haskell.

In fact, the only Haskell software I can think of is Darcs, a DVCS that was so buggy and slow when I first started learning Haskell in 2010 that the community recommended against using it, and of course xmonad, dons' tiling window manager that he flagrantly abused his moderator status on r/programming to aggressively promote.

Yet Haskell remains one of the most popular languages here. There are more stories about it than Perl or C#. From this I can only conclude that Haskellers are all talk and no action, and IMO, this reflects very poorly on the language and its community.

EDIT: Also, the downvotes that one swiftly and copiously collects from merely criticizing Haskell and its community also reflect very poorly on both.

Re: Monads Explained Quickly

#33
post #17

Earlier quoted context omitted.

At risk of adding to the pile of half baked pedagogy, here's my take at why they're useful. The operation to chain things together (denoted >>= and pronounced bind) in the Maybe monad has type Maybe a -> (a -> Maybe b) -> Maybe b In a more a java-like notation, this is like Maybe bind(Maybe , Function >) The Haskell notation says that it's a function that takes two arguments (separated by ->). The first argument (May…

For the "maybe a" case, you then need to take all of your code and place it in some machinery that knows what "maybe" means, and how to extract "a" from it. And then you need to write or convert all your functions to return maybe values rather than just plain values. All of this could be easily done with exceptions. Why do all that when something simple like an exception will do, is easily understood, and easily code…

Yeah sure, I'm in the mood to write, but didn't want to cram too much into one post, else risk muddying the message. It turns out that doing (a -> m b) instead of (m a -> m b) can still allow really cool control flow. But first let me address some of your points.

>For the "maybe a" case, you then need to take all of your code and place it in some machinery that knows what "maybe" means, and how to extract "a" from it.

This isn't too bad, since somebody else wrote all that machinery. It's just a nice simple library that is super flexible, and integrates well with everything around it (in haskell at least).

>And then you need to write or convert all your functions to return maybe values rather than just plain values.

I was worried people might think that. The other function besides bind needed to make a monad is called "return" or "pure." It's a function of type a -> m a. For Maybe, it just changes the type from a to Maybe a and retains the value. The constructor is called Just, because it takes 1 and returns Just 1. It's like a default way to stick a pure value into this monad. You can compose this with any of your regular functions instead of writing or converting your nice pure (a -> b) functions. So if I have a pure value like 1, and want to apply a pure function f that just adds 2, but need to return a Maybe, then I can use return, as in "return (f 1)". Now it returns the maybe type. With javascript syntax lambda functions, using bind, I can write

  bind(Just 1, one => {return (one + 2)})
or in haskell lambda syntax (\x -> f x) with the infix version of bind (>>=)

  Just 1 >>= \one -> return (one + 2)
That way, I didn't have to convert my addition function + to return maybe values (maybePlus or something), I just used it with return.

It is even more useful with two variables:

  Just 1 >>= \one ->
  Just 2 >>= \two ->
  aNullableFunction one >>= \x ->
  return (aNonNullableFunction two) >>= \y ->
  return (one * y + two * x)
Hopefully that convinces you that you don't need to convert your functions, like aNonNullableFunction, +, or * . Additionally, haskell has syntax sugar to make that chain of functions much prettier:

  do
    one 
>All of this could be easily done with exceptions. Why do all that when something simple like an exception will do, is easily understood, and easily coded?

It's just easy to explain with simple examples that can be dealt with other ways. By no means is it restricted to simple tasks. Random number generation is a fun one. In python, if you were determined to avoid global state for random number generators, you might have all your functions take a seed, like

  (x, newSeed) = randomUniform(seed)
  (y, newerSeed) = randomNormal(newSeed)
  return (x*y, newerSeed)
while in the haskell equivalent, you can recognize the common "takes seed -> returns value and new seed" and let all that passing around seed stuff be implicit:

  do
    x 
It's convenient because you can program with x and y as regular integers, not fancy wrapped values, but still not have to worry about passing the random number seeds around.

It's out of the scope of a comment, but the coolest case study might be software transactional memory (STM). I'm going to do what I hate in the haskell community and link a paper that explains it better than I could, but I'm getting tired. http://research.microsoft.com/en-us/um/people/simonpj/papers... The idea is that STM let's you write code where bind appears to be simple pointer magic, but actually does things behind the scenes to keep concurrency nightmares from happening while being easy to use.

And you really don't need to grok category theory. Some of the most prolific haskellers have said they don't, which gives the rest of us hope.

Re: Monads Explained Quickly

#34

I see monad tutorial after monad tutorial posted here, but never some new, awesome piece of technology produced using Haskell. In fact, the only Haskell software I can think of is Darcs, a DVCS that was so buggy and slow when I first started learning Haskell in 2010 that the community recommended against using it, and of course xmonad, dons' tiling window manager that he flagrantly abused his moderator status on r/pr…

pandoc, quickcheck and git-annex are the first things that came to mind.

Re: Monads Explained Quickly

#35
post #34

I see monad tutorial after monad tutorial posted here, but never some new, awesome piece of technology produced using Haskell. In fact, the only Haskell software I can think of is Darcs, a DVCS that was so buggy and slow when I first started learning Haskell in 2010 that the community recommended against using it, and of course xmonad, dons' tiling window manager that he flagrantly abused his moderator status on r/pr…

pandoc, quickcheck and git-annex are the first things that came to mind.

Judging by the volume of posts here about it, there should be as impressive a portfolio for it as there is for C# or Perl. There isn't.

Re: Monads Explained Quickly

#36
post #34

Earlier quoted context omitted.

pandoc, quickcheck and git-annex are the first things that came to mind.

Judging by the volume of posts here about it, there should be as impressive a portfolio for it as there is for C# or Perl. There isn't.

Mathematics is also a popular topic on HN but there isn't an impressive portfolio of projects written in that either. Pretty daming for mathematics.

Re: Monads Explained Quickly

#37
post #8

Stop explaining monads. There are two ways to approach them. One is by doing. The other is by math. If you can't understand how "monads are monoids in the category of endofunctors", you should try learning by doing. Don't try reading about it, don't try reasoning about it. Just do it. EDIT: okay, I'll explain. Haskell et al. have this really neat propensity to abstract well. That means that very many concepts (Promis…

>The other is by math. If you can't understand how "monads are monoids in the category of endofunctors"

I don't think you need to understand that in order to have a more abstract understanding of Monads.

Just go read the Monad typeclass definition (EDIT: and consequently the Applicative and Functor definitions). If you don't understand what it means, learn about higher kinded types and typeclasses until you do.

Once you understand what the definition means, that's it. No really, that's it. And now, since you're probably wondering what all the fuss is about, that's when you need to start learning by doing.

Re: Monads Explained Quickly

#38
post #13
post #11

Earlier quoted context omitted.

Everyone here is saying the article is wrong, but no one really adds anything or corrects the author. Can you expand?

Firstly the article says a monad needs to have a way to extract the value out of it. This is patently false. The most famous monad of all, the IO monad doesn't have a way to extract anything from it (notwithstanding evil trickery). Secondly the article says it needs a way to map a function over it. This is a functor not a monad. Being chainable is not overly important, as the functor law ensures that chained applicat…

I'd prefer to use the Maybe monad as an example of not being able to extract a value, as it's far clearer that sometimes there is no such value.

>Secondly the article says it needs a way to map a function over it. This is a functor not a monad.

Yes, but since monad is a superclass of functor, it's still a necessary property. Certainly, I'd much prefer it be taught in that order, but this is definitely a property you need to understand in order to form intuitions about monads.

Re: Monads Explained Quickly

#39

There are so many attempts at describing what monads are, but so few attempts at teaching why you would want to use a monad, and where it would be beneficial over other coding styles.

The benefit is that, by recognising a common pattern of composition among many different types, you can develop a whole suite of functions that work with anything that follows that composition pattern.

This means you can encounter an unfamiliar monadic type, and form a decent intuition for what it does based on its purpose (although obviously you should probably check). Then you can encounter a weird new data structure, and immediately start mapping monadic functions over it without learning anything about its internals.

Also, a lot of monads make it more convenient to deal with certain things more strictly (IO, checking Maybes, avoiding mutable state etc.) such that you actually do them, instead of thinking they're too much faff.

Re: Monads Explained Quickly

#40
post #19
post #11

Earlier quoted context omitted.

Everyone here is saying the article is wrong, but no one really adds anything or corrects the author. Can you expand?

The problem with monads is that truly understanding monads renders one completely incapable of explaining monads to anyone uninitiated. This seems to be the most fundamental property of the monad. It seems, from the plethora of monad explanation articles that get posted here, that many people, in their hubris, think they've learned monads and think that they will succeed where so many others have failed and come up w…

I feel like you're overstating the problem, and I think that in itself is a good portion of the problem to start with.

Monads have acquired this mystique that actively makes them harder for people to understand, because they don't have enough moving parts to satisfy people's expectations of a difficult concept. More often than not, the reaction of someone finally understanding monads is "Is that it?", and the answer is yes.

There exist decent two reasonable pedagogies for learning monads, and good examples of them. The first is to teach people all the prerequisite concepts (HKT, typeclasses, Functors and Applicatives) properly, and then demonstrate a case where they're not quite enough, and you need a monad. Learn You A Haskell is a good example of this.

The other is to discuss different examples of monads in non-monadic terms until people start to see the common pattern between use cases. As I understand it, this is the approach taken by You Could Have Invented Monads.

And the final ingredient is just perseverance. I think at some point, all you can do is keep working until it clicks. Perhaps we'll eventually work out a pedagogy which avoids this, but for now all we can do is try to convince people they'll get it if they keep trying. Lots of people who don't consider themselves mathematical geniuses have managed it.

Post reply on HN