QUEST
haskell
Functor Monad Applicative Maybe IO Either List Reader
The type hierarchy: circles are type classes, triangles are constraints, rectangles are concrete types.

Begin with Types

In Haskell, types are not an afterthought. They are the foundation. Every expression, every function, every value carries a type. The compiler knows, and it demands that you know too.

This is not a language that lets you pretend types don't exist. This is a language that makes types your greatest ally.

Understand Functions

Functions in Haskell are pure. Given the same input, they will always produce the same output. No hidden state, no surprises, no side effects lurking in the shadows.

This purity is not a limitation. It is a liberation. When you can trust your functions, you can reason about your programs.

Embrace Monads

Monads are not a mystery. They are a pattern. A way to sequence computations that carry context -- failure, state, IO, nondeterminism.

The Maybe monad handles failure gracefully. The IO monad manages the real world. The List monad explores possibilities. Each monad is a different kind of computation.

Master Type Classes

Type classes are Haskell's answer to polymorphism. They define shared behavior across types without inheritance, without objects, without the baggage of OOP.

When you write a function constrained by a type class, you are writing code that works for any type that fulfills that contract. This is abstraction at its finest.

Ascend to Type-Level Programming

At the summit of the quest, types themselves become a programming language. GADTs, type families, data kinds -- these are the tools of type-level programming.

Here, the compiler becomes your collaborator. You encode invariants in types, and the compiler enforces them. Programs that compile are programs that are correct.

Your progress across the quest