1.9 KiB
Haskell Traverse for Batch Resolution
This note covers 30-haskell-traverse-resolution/, which resolves a batch of deployment requests against a service catalog with traverse.
1. Why traverse Is the Point
Each deployment request needs an effectful resolution step:
- parse the environment,
- look up the service in the catalog,
- choose the right image tag, and
- reject environment and release-track combinations that are not allowed.
For one request, that is just Either String ResolvedDeployment.
For a whole batch, the example uses:
resolveRequests :: Catalog -> [DeploymentRequest] -> Either String [ResolvedDeployment]
resolveRequests serviceCatalog = traverse (resolveRequest serviceCatalog)
That is the core lesson. traverse sequences the per-item effect and preserves the list structure.
2. What Makes the Example Non-Trivial
The resolution step is more than one lookup.
It decides:
- which image tag to use for
stableversuscandidate, - whether the service even publishes a candidate image, and
- whether the service is allowed in production at all.
That makes the batch resolution behavior worth teaching on its own.
3. Why the Batch Fails as a Unit
This example uses Either, so the whole batch fails on the first invalid request.
That is intentional. The goal here is not accumulated validation. The goal is sequencing several effectful resolutions through one structure with
traverse.
28-haskell-applicative-validation/ already covers the accumulated-error case.
4. Commands to Try
cd 30-haskell-traverse-resolution
nix develop
cabal run
cabal run -- api:production:stable worker:staging:candidate auth:production:stable
cabal test
nix build
./result/bin/mini-resolution api:production:stable worker:staging:candidate auth:production:stable
nix run . -- api:production:stable worker:staging:candidate auth:production:stable
nix flake check