Why are macros in Haskell terrible, but macros in Racket great?
A build tool giving me a transitive dependency on text only so that the instance you defined compiles is pointless.
A Semigroup is a data type together with a method of composition satisfying the associativity rule.
Applications, then, are just an environment comonad of monad morphisms. More plainly, they’re a record of effect interpreters.
By replacing conditionals with lambdas, we can invert control and make our code both easier to reason about and more generic.
But what we need is a run-time error, not a compile-time one. (This is one of the rare cases you’ll hear a Haskeller saying this.)