58 lines
2.9 KiB
Markdown
58 lines
2.9 KiB
Markdown
# 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
|
|
|
|
---
|
|
|
|
## 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
|
|
|
|
---
|
|
|
|
## 3. Related Notes
|
|
|
|
- `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`
|