Why inbreeding is bad for your community
I decided to try out the Yesod Web Framework for Haskell today. I did this knowing full well that the Haskell/Hackage/Cabal ecosystem and infrastructure is almost gloriously broken. “Hey,” I thought. “How bad could they possibly make what is supposed to be one of the flagship packages showing off the strengths of their language?”
Very bad indeed, my droogs
The Cabal setup is fundamentally broken in Haskell. Packages in the Hackage database are extremely picky about their version requirements (which is fair enough, given that even bumping up a minor version number in a Haskell package frequently involves massively-incompatible API changes—apparently semantic versioning isn’t a thing in the community) and Cabal does absolutely no version management whatsoever. The only thing it can tell you is that if you install a package that will force a version upgrade that another package might get broken. (When you read these messages you might as well s/might/will most fucking definitely/g because I’ve never seen a case where an upgrade didn’t break another package insisting on a previous version.)
I made the mistake of trying to install Yesod after I’d installed a few other Haskell packages. Cabal flipped its lid and simply refused to continue past this point. Trying to force it, as expected, broke the whole ecosystem so badly I simply couldn’t get back to anything that worked at all.
Initiative comes to thems that wait
So, after a brief discussion with some nice, earnest people in #haskell (props to both ivanm and byorgey for your help!) I just decided to cut my losses and do everything from scratch. I mean it’s not as if I actually do any real programming in Haskell. (Mostly because of the Cabal fuck-up, mind, but still.) So off I go and delete
$HOME/.ghc to start from a clean slate. I execute
cabal update to get the package list and…
…until it finally finishes. It suggests I upgrade my cabal-install package to the latest and greatest.
cabal install cabal-install (this command line brought to you by the Department of Redundancy and Unnecessary Repetition Bureau) gets run and…
…until it finally finishes. Then just for safety I do a
cabal update again. Only to be told that there’s an update available to cabal-install.
This isn’t looking so good, is it?
I decide to ignore that error and continue with the advised installations. I
cabal install cabal-dev and…
…until it finally finishes. Then I
cabal install yesod-platform and…
…wait… ...wait… ...wait… ...wait…
…until it finally finishes RECOMPILING THE ENTIRE FUCKING WORLD!
But, at least, it now worked. The installation succeeded and I can run the
Oh bliss, bliss and heaven…
yesod init # answer the questions cd yesod cabal-dev install
Oops. Fucking major oops here. Because, get this,
cabal-dev RECOMPILES THE ENTIRE FUCKING WORLD ALL OVER AGAIN. EVERY library I’ve ALREADY installed via
cabal gets recompiled again. “Initiative comes to thems that waits” indeed! I had a whole lot of fucking initiative going on here, let me tell you!
Still, surely this was all worth the wait, right? I could finally, after the successful build, finally get my type-safe web-app building funk on, right?
Suddenly, I viddied what I had to do, and what I had wanted to do…
Not a fucking chance in Hell.
yesod --dev devel
…until it finishes building shit. (How many times have I had to compile shit now just to get a web app started?!) Mercifully this was a far shorter build. It only had to recompile 8 files this time. Unfortunately it crashed hard on the last one. Apparently cabal-dev does something weird with ghc, wrapping it in something else, and that was doing stuff that made it throw up its hands and just give up.
…and that was to do myself in; to snuff it
And that’s just what I chose to do. I threw up my hands and just gave up. The Haskell ecosystem is a worthless pile of shit, as far as I’m concerned. As someone put it in #yfl:
Haskell people don’t know when they’re shooting themselves in the foot because they can’t remember what it’s like to have a foot without a bullet wound.
My off-and-on experiences with the community over the past six or seven years bear this out. The intellectually inbred world of Haskell is such that people within it honestly can’t even see just how bad their ecosystem is. They’ve just internalized all these fugly quirks and failures and adopted what is to them minor little workarounds to each of them without once thinking of what it feels like to someone coming in from outside.
And keep in mind that Yesod is one of their points of pride; one of the things they point to as a success story for Haskell. (The other one they point to—xmonad—has very similar problems as soon as you start trying to use any kind of contributed modules.)
This, guys, is really not how to convince people that your platform rocks. Even if your platform is spelled E-R-L-A-N-G or R-A-I-L-S or N-O-D-E or…