Seriously, can someone please explain monads like we're dumb or something ?
post
God, you guys are idiots, it's so simple
- You take a Function
- ?????
- Result It can't be simpler /s
No joke that's pretty much every example I came across trying to get my head around it :D.
Not sure if using analogies is helpful or just going to be more confusing but, the way I think of a monad is similar to how I used to cook back when I worked in restaurants. I’d prep all my ingredients in small containers so I wouldn’t forget anything, and they’d be ready to go when needed. Then I’d start adding them to the main mixing bowl, one step at a time. If I forgot an ingredient or accidentally flipped the bowl, the recipe would fail — you can’t keep baking after that.
So a monad is like that bowl: if you mess up, it just dumps everything out and resets your little prep bowls, instead of letting you keep going and make a batch of shitty cookies
The “main-bowl” is the monad (the context that holds your values).
The “prep bowls” are the individual values or functions ready to be chained.
The “dump/reset” is the idea that once something goes wrong, the chain stops safely.
And “shitty cookies” are the result of not putting a monad in place and just sending it.
Maybe someone with a more diverse programming background can explain it better. But it's basically a function checker usually wraped in IF ELSE and RETURN.
Some pseudo code in case my analogy doesn't make sense.
def main():
bowl = get_flour()
bowl = add_butter(bowl)
if bowl is None:
return "Recipe failed — restart!"
bowl = add_sugar(bowl)
if bowl is None:
return "Recipe failed — restart!"
return bake(bowl)
Isn't your example just the builder pattern?
Yeah, that explanation is missing the critical point of generically applying external functions through flat_map/bind
I think this is a good explanation: https://fsharpforfunandprofit.com/rop/
A monad is a builder that lets you use previous partial results to make decisions while you build.
that sounds like a regular builder
Monads are just a monoid in the category of endofunctors. If you dont understand that, skill issue
Tap for spoiler
/s
Do you know C#? LINQ? IEnumerable? IEnumerable is a monad. That's how LINQ works.
You've been using monads all along.
Or for those using Java: Stream is a monad
Optional is my favorite example to give, at this point most people have internalized how to use its map function and how it works
You should crosspost this to !philosophymemes@quokk.au
Isn't it just like error handled code in Golang?
Like a sequence A, B, C where if A errors you don't continue to B or C but if A is ok then you just continue doing B and so on. In the end you end up with the result or errors. Am I wrong to assume this?
The Either monad (also known as Result) provides Go-like error handling, but automated. You only check manually for errors after the last call, the monad handles the process.
But this is just one example of a monad, there are many more.
Whenever I try and get a proper explanation of a monad from the internet I get these miserable opaque examples which make me go "sorry I asked!" But I think a monad is basically just single type that when unwrapped gives you the result of a calculation and some metadata about the calculation.
I think it's more like Rust's Result or Option types then go's tuples but I'd say they both basically count.
all 40 comments