Permissive, then restrictive: concrete solutions and examples
Summary
This 2020 Haskell design article outlines starting with permissive code to ship quickly, then progressively restricting it to gain guarantees. It provides concrete problem-and-solution examples (global config, mutability, error handling, logging, external services, IO testing, and data shapes) and discusses using Reader, monad transformers, and algebraic effects to manage side effects while maintaining testability.