# Haskell Map and Set Modeling This note covers `36-haskell-map-set-modeling/`, which models release approval policy directly with `Map` and `Set`. --- ## 1. Why These Structures Deserve Their Own Example Several earlier examples already use `containers`, but only as support code. This example makes the data structures themselves the teaching point: - `Map` for service ownership and environment access rules, and - `Set` for required, supplied, missing, and unexpected approver groups. That is a practical step up from list-based toy models. --- ## 2. What the Policy Computation Shows The report logic uses set operations directly: - intersection for required approvers that are valid in the environment, - difference for missing approvers, and - difference again for unexpected approvers. That makes the policy behavior compact and declarative. The code describes the relationships instead of manually looping over lists. --- ## 3. Why This Is Good Domain Modeling Ownership, access grants, and approval groups are not “just lists”. They have semantics: - service names map to owner teams, - environments map to allowed teams, and - approver groups should not contain duplicates. Using `Map` and `Set` makes those semantics explicit in the type choices. --- ## 4. Commands to Try ```bash cd 36-haskell-map-set-modeling nix develop cabal run cabal run -- api:production:platform,security cabal test nix build ./result/bin/mini-access-policy api:production:platform,security nix run . -- api:production:platform,security nix flake check ```