1.7 KiB
Haskell Monad Chaining
This note covers 35-haskell-monad-chaining/, which sequences several dependent rollout checks with Either and do notation.
1. Why Monad Chaining Matters
Some workflows cannot be expressed as independent field checks.
In this example, later steps depend on earlier successful results:
- find the service profile first,
- then check whether the environment is allowed,
- then validate the production change ticket,
- then choose the image tag for the requested track, and
- finally choose the approver.
That dependency chain is the point. Each step needs the result of the previous one.
2. Why Either Still Fits
This example does not need accumulated errors. It needs short-circuiting business logic.
That makes Either String a good fit:
approveRollout :: Catalog -> RolloutRequest -> Either String ApprovedRollout
do notation keeps the happy path readable while preserving the fail-fast semantics.
3. How This Complements the Validation Example
28-haskell-applicative-validation/ teaches independent checks that all run so several errors can be reported together.
This example teaches the opposite shape:
- one decision unlocks the next, and
- the workflow stops once a prerequisite fails.
That contrast is useful. It shows why “Applicative versus Monad” is not just theory. The control flow shape changes the design.
4. Commands to Try
cd 35-haskell-monad-chaining
nix develop
cabal run
cabal run -- api:production:stable:CHG-2048
cabal test
nix build
./result/bin/mini-monad-chain api:production:stable:CHG-2048
nix run . -- api:production:stable:CHG-2048
nix flake check