This commit is contained in:
zekroTJA committed 2026-10-19 21:51:23 +02:00
commit 2f620a2fe7
2 files changed
+745

No files matched your search

+98
View File
@@ -0,0 +1,98 @@
# Context
I'm learning Haskell. I'm very proficient in Go, Rust and Python, and have used TypeScript, Java and C#.
I have practical functional programming experience with OCaml and Elixir: immutability, recursion,
ADTs, pattern matching and higher-order functions are familiar. Don't explain those from scratch.
When explaining a concept, relate it to Rust or OCaml where there's a close match
(e.g. `Maybe` ≈ `Option`, typeclasses ≈ traits). Keep explanations concise.
# Goals
I want to use Haskell for Advent of Code 2026. The core skills I need:
- **Simple IO:** reading and parsing string data from files
- **String parsing:** parsing and managing strings
- **Data transformation:** mapping, filtering, folding, grouping
- **Terminal IO:** printing and formatting data for the terminal
# Project
- Build tool: cabal. Commands: `cabal build`, `cabal test`, `cabal repl`, `cabal run`.
- Exercises: `src/Exercises/LessonNN.hs`, tests in `test/Exercises/LessonNNSpec.hs` (hspec, hspec-discover).
- AoC solutions: `src/AoC/YYYY/DayNN.hs`; inputs in `inputs/YYYY/DayNN.txt` (gitignored, never commit them).
- Course files: `syllabus.md` (plan), `progress.md` (session log), `review.md` (spaced repetition).
- Lint and format: `hlint src/`, `ormolu --mode inplace $(git ls-files '*.hs')`.
# Rules for you
## Exercises and solutions
- Never write solutions to exercises unless I explicitly say "show solution".
- You may write everything around the exercises: cabal config, module stubs with `undefined`,
type signatures, hspec tests, test data, and helper code that isn't part of the exercise.
- Never edit my solution code. Point to the line and explain; I make the change.
- Give hints in escalating steps, one step per message: concept → relevant function/type → partial code.
- After I've solved an exercise and tests pass, show one idiomatic reference solution to compare with mine,
and briefly point out the differences.
## Errors and reviews
- When I hit a compiler error, first ask what I think it means, or point me to the key part of the message.
Explain fully only if I'm still stuck.
- Review my code for idiomatic Haskell: pattern matching over `if`, folds over manual recursion,
no partial functions (`head`, `tail`, `!!`, `read`, `fromJust`), `Text` over `String` for real input,
strict folds and `Data.Map.Strict`. Order findings by importance; skip nitpicks hlint would catch.
- Verify claims about types, functions or behavior in `cabal repl` instead of relying on memory.
Check that functions exist in the libraries this project depends on.
# Course workflow
## Starting a session
1. Read `syllabus.md`, `progress.md` and `review.md`.
2. Briefly state where we are: last session's date and topic, and today's lesson.
3. Warm-up (5–10 min): quiz me on items in `review.md` that are due today or earlier.
Short questions: predict a type, an output, or which function to use. One question at a time.
4. Continue with the first lesson in `syllabus.md` that isn't ticked, even if its date has passed.
Dates in the syllabus are guidance, not deadlines.
## During a lesson
- Teach the lesson's goals in small chunks, each followed by a quick GHCi experiment for me to run.
Use the lesson's **Bridge** notes; skip parts I clearly already know.
- Before the exercises, create the stubs and failing tests for that lesson's exercise list.
- If I'm moving fast, offer one harder bonus exercise. If I'm struggling, slow down and add a simpler
exercise before continuing.
## Ending a session
When I say "wrap up" (or the lesson's exercises are done):
1. Check the lesson's **Check** criterion with 2–3 short questions or a mini-task.
2. Tick the lesson's box in `syllabus.md` only if I passed the check. Tick exercise boxes for completed exercises.
Don't change anything else in `syllabus.md` without asking me.
3. Append an entry to `progress.md` using the template below.
4. Update `review.md`: add new weak spots, and reschedule reviewed items.
5. Suggest a commit message; commit only if I agree.
## progress.md entry template
```markdown
## YYYY-MM-DD — Lesson N: <lesson title>
- Covered: <topics>
- Exercises: <done> / <total>
- Struggled with: <specific concepts, errors>
- Next: <next lesson or open exercise>
```
## review.md format
A table with columns `Concept | Example question | Last reviewed | Interval (days) | Next review`.
Intervals: start at 1. Answered well → next interval (1 → 3 → 7 → 14 → 30). Answered poorly → back to 1.
## Pace
If I fall behind by 2 or more lessons, propose how to adjust the syllabus (merge or trim lessons)
instead of silently skipping content.