Why are all "ML-family" languages & their toolchains such pains to set up?
I want to feel smart & cool, but I have no patience & a low IQ
I began my Programming Journey with a variety of LisP1—Racket, to be exact; possibly best considered a descendent or type of Scheme—so functional programming has tended to feel more “natural”, to me, than the imperative or object-oriented sorts. Hence, I was secure in my position at the top of the Programming Stack: a real cool guy, coding in the most theoretically advanced & pure computer-science-y language out there!2
And then… I see this:
Hmm. Haskell, eh?
The image doesn’t even seem so far-off from the truth, in fact: programming-language & computer-science enthusiasts will wax poetic about the glories of the pure & elegant mathematical beauty of Haskell at the drop of a table. So—the next step is obvious, if you make all of your decisions based upon how they will cause you to be perceived by strangers (as I do): let’s start Haskelling!
I. More like Trashkell amirite
…except, no. Let’s not. Because what the hell, guys? I have actually coded up an entire application (albeit a small & basic one) in less time than it took me just to get Haskell working on my machine!
I mean, look—for, say, Python, you just download & install the interpreter & its runtime environment, then install an extension in VSCode; easy, quick, painless. Racket is similar; JavaScript requires even less than this; but Haskell… oh, man.
For Haskell, I had to run a bunch of different commands in terminal, and wait for hours (or, well, it felt like hours) for some gigantic, multiple-gigabyte installation to finish, and make a bunch of choices I didn’t quite understand (what’s the difference between Stack & Cabal? what’s this “Mingw” thing? why do I need “GHCup” in the first place? why are there three different identical directories of Haskell-related files after install?!)…
…and then it still didn’t work right! I had to mess with “ghcide” which was also not a simple install,3 and then it turns out there’s also “ghci” & “ghcid” & all three of these are different things, and then something went wrong involving a config file in Cabal, and updating usually breaks something, and everything wants to stick itself in the PATH with different versions (to which Haskell is apparently super-sensitive) & I don’t know or understand really quite what a “resolver” is or how it will fix this, and aaaaah—
I lash out in blind fury every time a box of cereal gives me a bit of trouble in the opening. Dealing with frustrating & finicky tasks is, in other words, not—exactly—my forte.
(Yes, I gave up.)
II. Other Options?
…but I still wanted to try a Haskell-esque programming language. If I understand aright the words of my betters, most or all functional languages descend from one of two venerable ancestors—conceptually, at least, if not in a technical sense—which took two different approaches to the paradigm:
LisP: the List-Processor of Legend! the big granddaddy, the Potentate of Parentheses, the Lambda-Calculus Lord!
(vs.)
ML: hyper-text? pfft, nah—try Meta-Language! the other big granddaddy, the Prelate of Purity, the Combinator King!
…ahem. Anyway, I’d also read something about how combinatory logic was the conceptual underpinning of ML, just as the lambda calculus was for LisP; how could I rest till I had seen for myself which was the superior formalism?
Hence, the next step, I figured, was trying one of the other two well-known & fairly popular (relative to other functional languages, anyway) members of the family: either F#, or OCaml.
III. NoCaml
I decided to go with OCaml. Look, it’s got “ML” right there in the name! And it’s almost as “pure” & elegant as Haskell, sort of, maybe! I can at least get a taste of what I’m missing, now that I’ve deleted the entire Haskell toolchain in a fit of pique!
Everyone recommends me the Cornell OCaml book/course. Fine. Let’s see… “Installation Instructions”, here we go! Boy, I can’t wait to start my OCaml Journey; now, to just download an .exe & inst—
…OCaml doesn’t play nicely with Windows, it seems, and the package manager is “not fully supported” therein either. Huh.
So… I have to install an entire ‘nother operating system just to start programming in OCaml. Okay, well… I guess I can do that. Besides, now I can become one of those guys who talks about “Winblows” & who uses badass h4x0r Unix terminal commands all the time!
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
wsl.exe --install
wsl.exe --update
wsl --set-default-version 2
Whew! Now I can…
…well, start to install Ubunto:
(Is it fair to blame OCaml for the lengthiness of this procedure? Yes. You can’t just expect your average idiot to use ‘nix, c’mon! All of us use Windows only!)
Anyway, it was a hard road; but the pristine fields of OCaml awai—
—t! Await! I mean, now they await; just installation of the OCaml package-manager left, now that we’ve installed the Unix package-manager.
sudo apt install opam
And also initialization. We must also initialize OPAM.
Oh. OPAM doesn’t actually work that well with WSL1, either, apparently. No matter! I’ve got number two!
Sure, I’m having to learn how the hell Unix file-systems & shell commands work, on top of the (prospective) OCaml learning; but hey—it’s cool to know stuff (and Linux is some real h4x0r $h1t anyway, is my impression).
Next: OPAM switch! What is it? Who cares! We need it!
opam switch create cs3110-2025sp ocaml-base-compiler.5.2.0
And some more packages, so we can use “utop”! I will definitely remember what all of this stuff did, and what it all is:
opam install -y utop odoc ounit2 qcheck bisect_ppx menhir ocaml-lsp-server ocamlformat
Now we can set everything up on VSCode, finally! But it’s not just an extension we need; it’s an extension, and… um… this other thing, wherein I have to “connect to WSL”. Aaaand now it’s installing more stuff. What stuff? I don’t know! Ha-ha!
It almost seems like making OCaml work on Windows is adding an extra layer of software & complexity to everything. But it’s worth it, probably; we made it through, and—
AAAAAH WHERE WILL THE SET-UP END
…here, actually, in fact. That’s it: all you need to start!
But just to start. Ha, ha! You thought it would be smooth sailin’ from here on out, did you, Kvel? No! Wrong! It’s actually harder to get this dam’ thing to work smoothly than it is to get Haskell chuggin’ along! Here, juggle compiler switches & dependency conflicts! Struggle with permissions & environment variables & figuring out where the problem lies between WSL & OPAM! Have a cryptic build error, and see if you can figure out why this update broke everything in your project! Ha-ha-ha! We don’t actually want you to have decent tooling for Windows!
…so, uh, I didn’t actually get very far with OCaml.
(YMMV, of course; maybe it’s all great now—I have heard that matters have improved on the WindOCaml front—but, you know, in retrospect: maybe F# would’ve been the better choice, for me…)
IV. F F#
In fact, why did I even go for OCaml in the first place? I’m a Windows user, programming for other Windows users; of course I should have gone with the .NET choice!
For once, installation & set-up was easy. Instead, F# has different problems:
a.) It’s difficult to find good books or documentation for the novice—it seems like every one I pick up starts off with a pitch along the lines of: “So, you’re an experienced .NET developer…” or “For senior C# engineers like you, this book will…” or “While you’re taking a break from Unix kernel development, why not try F#, which…”; vel sim.
b.) Ionide sux:
Maybe… maybe I should just go back to Python.
V. Conclusion?
Alright, alright, I admit it: most of this stuff is not really that difficult; one can make it work—I have made it work, at least for a little bit, in all three cases!—but…
…they don’t exactly make it easy & welcoming, y’know?
To be clear, none of the above is intended as serious criticism—I’m merely a dilettante, a hobbyist! I hardly even know what I'm doing anyway (if you can believe it)! I just had the thought—found it a bit funny—right after the third ML-family language in a row (F#) started giving me some tooling troubles: “…man, why is it these particular languages?!”
Why no well-supported, modern, ML-style language that has a nice ecosystem/toolchain, and which lets morons such as myself dip our toes in? Why they all gotta be like this?!
Or… perhaps F# will end up being the champion, after all—I’m still in the process of giving it a shot, and so far it’s actually been quite nice (despite the lack of good beginner-oriented instructional material).4
There’s also, like… Elm? Might be that this ‘un (or some other language that I haven’t even thought of) fits the bill?—though I think Elm is quite specialized for front-end work, of which I do none (mostly, I just write little command-line applications for personal use).
Lately, I admit, I sometimes fear that it might be a bit too late for all this—for getting deeper into programming, trying to learn more computer science, experimenting with different paradigms & languages—what with AI, and all… but hey—it turns out to be pretty fun,5 at least! (And you never know: maybe coding teaches you to think gooder or something, too…?)6
In that spirit, I’m considering giving Haskell another try, as well as continuing on with F#; I like foolin’ around with new languages in general, anyway—so any suggestions along these lines are welcome. Cheers, y'all.
I know it ought to be “Lisp”, really; but “LisP” makes more sense! List Processing, see?
My inability to write anything more complex than a “Space Invaders” knock-off is beside the point.
Or, well, okay: it was relatively simple, I guess. But remember, I’m a caveman & probably shouldn’t even be messing with Haskell at all. I’m not used to having to “build” tools to get build tools! Gimme an EXE to double-click! Microsoft isn’t just my nickname among the working ladies—it’s my way of life.
Though if I’ve somehow missed the existence of an up-to-date & well-written/-organized F# book—one that’s appropriate for a novice—please lemme know!
As I discovered right when it started to become evident that coding was, very likely, no longer a viable career option for me. Why couldn’t I have realized that I really enjoyed programming back in like 2015 or something, is what I keep asking myself.
Possibly, just getting OCaml to work on Windows is equivalent to a month of strenuous brain-training.
"Why no well-supported, modern, ML-style language that has a nice ecosystem/toolchain, and lets morons such as myself dip our toes in? Why they all gotta be like this?!"
Maybe it's on purpose and the goal is to filter out the unfit like a weeder class :P
Even though I only understood maybe 60% of this post it still made me chortle several times!
I'm not really a programmer or anything, but I am a Linux "daily driver" and (apologies if this comes out as too pop-eyed and evangelical... no wait where are you going....?) I struggle to understand why somebody would be trying to program in Windows, which must be like trying to swim in treacle, and I can't help feeling like all this stuff would be *sooo* much easier if you ran e.g. Windows-user-friendly Kubuntu inside a VM? Then you could install Haskell with one command (provided you don't mind "curl | bash" - in other words downloading a script off the internet, not reading it, and immediately executing it in a shell - not even remotely secure but ultimately no worse than downloading an .exe file off the internet...)
Or for F#, how good are AIs at coding in F#? I wonder whether, if they're good enough, you wouldn't need any textbooks because you could have a full-time personal teacher? (I would guess Claude would be the best AI for this, from what little I've used all the main ones...)
If I had to choose a programming language, I think probably I would choose on the basis of what the AIs were best at (which is probably a function of how much example code there is of each in their training corpus, and hence a function of how popular each language has been over the last 20 years or so..) just so's I could be taught by an AI instead of a textbook...
References:
Kubuntu: https://kubuntu.org
VMware Workstation: https://blogs.vmware.com/cloud-foundation/2025/03/10/vmware-fusion-workstation-going-free-new-resources
Install Haskell on *buntu: curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | bash
Claude chat I had when writing the above: https://claude.ai/share/e201936c-4233-4b72-8e4e-e038609f1be9