preparing the soil
Haskell basics, made earthy.
Every Haskell garden begins with dependable ground. Values do not wriggle into new shapes behind your back; once planted, they stay themselves. Functions are pure, too: give them the same compost of inputs and they return the same bloom every time.
The compiler is not a scolding crow. It is your patient almanac, catching frost warnings before you lose the crop. When a signature says a function takes a String, it means a String — not a surprise turnip.
greet :: String -> String
That double colon is a promise label on the seed packet. You can read it before the program runs and know exactly what sort of plant you are tending.