A function that always returns the same output for the same input isn't just predictable — it's a promise. Pure functions are the foundation of trust in code.
Immutability isn't a constraint. It's freedom from the tyranny of unexpected change.
Types don't restrict what you can say. They ensure that what you say makes sense.
Laziness isn't about being idle — it's about doing exactly the work that's needed, precisely when it's needed.
fix $ \f n -> if n < 2 then n else f(n-1) + f(n-2)
Fibonacci
foldr (\x acc -> x : acc) []
Identity Fold
fmap (+1) [1,2,3]
Functor Mapping
pure 42 >>= return
Monad Laws
traverse :: (a -> f b) -> t a -> f (t b)
Traversable
(<*>) :: f (a -> b) -> f a -> f b
Applicative
id :: a -> a
Identity
Types are the poetry of logic.