In an all too familiar trade-off, the result of striving for ultimate simplicity is intolerable complexity; to eliminate too-long proofs we find ourselves “hopelessly lost” among the too-long definitions.

So the tension around types comes from the fact that if you want to program in a style that turns effects into explicit things that get passed around, sophisticated higher-order functions are necessary to keep your code reasonably clean. And sophisticated higher-order functions tend to have fancy complicated types. To make programming with them palatable, you either need to have a correspondingly fancy type system or punt on types entirely.

  • When I worked with companies that have a holy mess of code, I felt like there wasn’t enough time in the day to refactor everything. When things broke when I refactored them I got yelled at. It felt like a miserable existence.

  • When I worked with a company that had clean code I didn’t have much work to do. It was all just boring things like adding more controllers and views and CRUD tasks. It felt like a miserable existence.

– comment at Reddit