nix-playgraound/notes/014-haskell-learning-path.md

4.8 KiB

Haskell Learning Path

This note links the Haskell examples in a suggested order from first project structure through intermediate language and application patterns.


1. Suggested Order

  1. 05-haskell/: a small Cabal library, executable, test suite, and dev shell
  2. 06-haskell-shellfor/: a Haskell package set override and a shellFor-based dev shell
  3. 07-haskell-deps/: external Haskell libraries through Cabal build-depends
  4. 08-haskell-adt/: algebraic data types, records, and pattern matching
  5. 09-haskell-newtype/: newtype, smart constructors, and validation
  6. 10-haskell-effects/: ReaderT, Except, and constrained application logic
  7. 11-haskell-typeclasses/: custom type classes and per-type instances
  8. 12-haskell-parser-combinators/: parser combinators with Megaparsec
  9. 23-haskell-maybe-either/: optional values, required-field errors, and layered request validation
  10. 24-haskell-deriving/: deriving strategies for ordering, enumeration, and wrapper behavior
  11. 25-haskell-state/: pure stateful planning with global and per-environment counters
  12. 26-haskell-quickcheck/: property testing for a non-trivial normalization function
  13. 27-haskell-aeson-roundtrip/: explicit JSON instances and round-trip checks
  14. 28-haskell-applicative-validation/: accumulated field validation with an Applicative error type
  15. 29-haskell-foldmap-summary/: monoidal event aggregation with one foldMap pass
  16. 30-haskell-traverse-resolution/: batch resolution of requests through traverse
  17. 31-haskell-writer-audit/: rollout logging with Writer
  18. 32-haskell-nonempty-waves/: rollout planning with NonEmpty
  19. 33-haskell-optparse-cli/: command-line parsing with optparse-applicative
  20. 34-haskell-dependency-order/: dependency-ordered planning with cycle checks
  21. 35-haskell-monad-chaining/: dependent rollout approval with monadic Either
  22. 36-haskell-map-set-modeling/: access-policy modeling with Map and Set

2. What to Focus on at Each Step

  • 05-haskell/: how a Cabal package becomes a flake package, app, dev shell, and check
  • 06-haskell-shellfor/: when a Haskell-specific dev shell is more useful than a generic shell
  • 07-haskell-deps/: why Cabal stays the source of truth for package dependencies
  • 08-haskell-adt/: how to model a problem with constructors before writing behavior
  • 09-haskell-newtype/: how to move validation to the boundary and protect the domain model
  • 10-haskell-effects/: how to separate configuration, logic, and failures
  • 11-haskell-typeclasses/: how to abstract shared behavior across several types
  • 12-haskell-parser-combinators/: how to build a small language from reusable parser pieces
  • 23-haskell-maybe-either/: how optional fields and validation errors play different roles
  • 24-haskell-deriving/: how derived behavior depends on constructor and field layout
  • 25-haskell-state/: how to thread evolving planning state without leaving pure code
  • 26-haskell-quickcheck/: how to test invariants across many generated inputs
  • 27-haskell-aeson-roundtrip/: how to keep domain values and JSON formats aligned
  • 28-haskell-applicative-validation/: how to report several field errors without stopping at the first one
  • 29-haskell-foldmap-summary/: how to express batch aggregation through monoidal summary fragments
  • 30-haskell-traverse-resolution/: how to sequence per-request resolution across a whole batch
  • 31-haskell-writer-audit/: how to compute a result while accumulating ordered audit output
  • 32-haskell-nonempty-waves/: how to encode “at least one rollout step” in the type
  • 33-haskell-optparse-cli/: how to parse a real CLI into typed commands
  • 34-haskell-dependency-order/: how to derive a correct deployment order from dependencies
  • 35-haskell-monad-chaining/: how to express fail-fast workflows where each step depends on earlier results
  • 36-haskell-map-set-modeling/: how to use Map and Set as primary domain structures, not just helpers

  • notes/007-haskell.md
  • notes/008-haskell-shellfor.md
  • notes/009-haskell-dependencies.md
  • notes/010-haskell-adts.md
  • notes/011-haskell-newtypes.md
  • notes/012-haskell-effects.md
  • notes/013-haskell-typeclasses.md
  • notes/015-haskell-parser-combinators.md
  • notes/026-haskell-maybe-and-either.md
  • notes/027-haskell-deriving.md
  • notes/028-haskell-state.md
  • notes/029-haskell-quickcheck.md
  • notes/030-haskell-aeson-roundtrip.md
  • notes/031-haskell-applicative-validation.md
  • notes/032-haskell-foldmap-summary.md
  • notes/033-haskell-traverse-resolution.md
  • notes/034-haskell-writer-audit.md
  • notes/035-haskell-nonempty-waves.md
  • notes/036-haskell-optparse-cli.md
  • notes/037-haskell-dependency-order.md
  • notes/038-haskell-monad-chaining.md
  • notes/039-haskell-map-set-modeling.md