← Back to context

Comment by epgui

4 days ago

How is this not a monad? It might be trying really hard not to reify the core concept of a monad, but it seems to me like it ends up being essentially a complicated monad.

It’s definitely monad-adjacent.

The main difference is that SideEffect isn’t a compositional context — there’s no bind/flatMap, and composition intentionally stops once it appears. It’s meant as an explicit early-exit signal in pipe-first code, not a general computation container.

  • Is there any advantage whatsoever to this, as opposed to a proper monad? I’m not seeing it.

    The point of monads is that they solve this exact category of problem in the simplest possible way.

    • fp-pack is also intentionally scoped for everyday frontend developers.

      It tries to borrow function composition and declarative structure without requiring familiarity with full FP abstractions like monads or effect systems.

    • One more practical point is that a full monad doesn’t fit very naturally into a pipe-first interface.

      Once you commit to a real monad, you need map/flatMap, lifting, unwrapping, and rules about staying inside the context across the whole pipeline. At that point, the pipe abstraction stops being the primary mental model — the monad does.

      SideEffect deliberately avoids that. It keeps the pipe interface intact and only adds a single, explicit signal: “stop here”. That’s why it’s less powerful than a monad, but also much simpler to integrate into existing pipe-based code.