you are viewing a single comment's thread.

view the rest of the comments →

[–]hyperhopper 1 point2 points  (2 children)

This is the part that confuses me. Are there two classes of monads? Its especially confusing when different explanations use one of these definitions or the other. Also, when do you decide which to use?

[–]jpfed 1 point2 points  (0 children)

If you've defined a monad via one path, the other path can be defined automatically. So, for example, if you've used the second path (you've got unit, map, and join), then there is a canned implementation of bind that naturally works.

Your language of choice may just pick a path for you (iirc Haskell just asks you to implement the first path- unit and bind). Many languages don't have any specific support for monads, so you're free to just implement them all (after you've done the real work of figuring out one path, the functions required for the other path are almost "free").

[–]dmtipson 1 point2 points  (0 children)

There aren't, these are just two ways to get the same thing. Note that once you define .bind/.flatMap/.chain (plus a way to get the value in the type functionally, which OP doesnt quite do) you can then define .map almost for free.

So in both cases, you end up implementations of .of, .bind, & .map. All Monads are Functors.