Create a Brobdingnagian monstrosity of 1.2m lines of Haskell. That way, the tooling you create to make working on it tolerable will be practically instant on codebases that don’t need 18 lanes for a 3 point turn.
(With love and appreciation, @mercury)
“Semigroup” and “Monoid” are exclusionary terminology. Prefer “smashy-smashy” and “smashy-smashy-with-extra-nothing”.
It's spooky. It's esoteric. It's also the key to understanding the rise and relevance of functional programming. wired.trib.al/qNfcKv9
Tired of probabilistic correctness guarantees?
instance Arbitrary UUID where
…
shrink uuid = case UUID.toWords uuid of
(a,b,c,d) -> [UUID.fromWords a' b' c' d' | a' <- sw a, b' <- sw b, c' <- sw c, d' <- sw d]
where sw w = take 10 $ iterate (`div` 2) w
The great thing about using Haskell with LLMs is that you can be absolutely precise about the nonsense you are ingesting and emitting.
Testing is for programmers lacking the moral fibre to prove every useful property about their code in the type system.
Yes, it will be extremely difficult to follow what's going on as the counterexample-finding algorithm dances between the different assertions. This is by design, and will help you back into the divine light of Writing Correct Code The First Time.
@DRMacIver has pointed out that Hypothesis will report all the assertions that fail rather than just the first. A decadent affordance to be avoided by the faithful.
If you're writing a parser for some type t, one fun thing to omit is a way to turn it back into a string. Easy visualisation, canonicalisation and roundtrip properties are for people who insist on putting bugs in their code and there is no reason to coddle them.
















