The article explores two ways to manage failure in Haskell. One approach involves passing potential errors forward using types like <code>Maybe</code> or <code>Either</code>, making the possibility of failure explicit. The other takes the opposite route, designing input types that prevent failure in the first place. Using custom types like <code>NonZero</code> or <code>NonEmpty</code> allows developers to avoid many checks later in the code, leading to cleaner, safer programs that rely on strong type guarantees. The idea is to catch problems as early as possible, often right at the boundaries of the system. As a Go developer, it’s always interesting to try to balance very nice concepts from functional-oriented languages and the imperative world without making a mess of it. Comments