

First suggestion is impractical. Not going to be able to memorize 100 names to look up and research later
Second suggestion should already be happening, but doesn’t capture the desired use case.
The use case is this: in physical life, there is a gradient of “boundaries/leashes” to match maturity and development. For example, the gradient of movie ratings, or:
- Very young - stay within arms reach/sight
- Young - stay in the yard/park/neighborhood
- Child - stick with what’s familiar, I’ll be nearby
- Pre-teen - go and try it, I can be right there
- Teen - go and try it yourself, call me if needed
We could argue about whether a gradient is too steep or shallow, but the point is that one exists.
In contrast, digital in many ways is very often all-or-nothing
Not saying digital should be “gradient-ed” in all cases, that leads to tone-deaf rules and bad security practices. Just trying to show what the problem is
It’s a container with certain behaviors and guarantees making them easy and reliable to manipulate and compose. A practical example is a generic List, that behaves like:
List[1, 2, 3]
, i.e. (“new”, “unit”, “wrap”) to create, containing obj(s)map(func)
to transform objs inside, List[A] -> List[B]first()
, i.e. (“unwrap”, “value”) to get back the objflat_map(func)
, i.e. (“bind”) to un-nest one level whenfunc(a)
itself produces another List, e.g.[3, 4].flat_map(get_divisors) == flatten_once([[1, 3], [1, 2, 4]]) == [1, 3, 1, 2, 4]
Consider the code to do these things using
for
loops – the “business logic”func()
would be embedded and interlaced with flow control.The same is true of Maybe, a monad to represent something or nothing, i.e. a “list” of at most one, i.e. a way to avoid “null”.
Consider how quickly things get messy when there are multiple functions and multiple edge cases like empty lists or "null"s to deal with. In those cases, monads like List and Maybe really help clean things up.
IMO the composability really can’t be understated. “Composing” ten
for
loops via interlacing andif
checks and nesting sounds like a nightmare, whereas a few LazyList and Maybe monads will be much cleaner.Also, the distinction monads make with what’s “inside” and what’s “outside” make it useful to represent and compartmentalize scope and lifetimes, which makes it useful for monads like IO and Async.