I was thinking of Haskell recently, why isn't it more popular with AI? Haskell is very terse and token efficient, it has many expressive safety features. Rust is getting additional adoption because of its strictness, so hey why not have this in Rust over Javascript if it takes the same time to write?
An ideal language for agentic AI I would think is extremely strict, where the AI can iterate over the tooling for correctness. It would probably be less verbose and more terse to allow the AI to be more efficient with tokens.
[3 hidden]5 mins ago
It's my default for all the reasons you mention.
In fact if I have to ship in a different language, I'll often do a Haskell version first to steer towards isolating IO, enforcing referential transparency, and generally picking up other functional patterns that are a good idea no matter what. Then I'll port the Haskell version to whatever the solution demands.
[3 hidden]5 mins ago
> do a Haskell version first [...] port
As lower-hanging fruit, to get some style steering, but not the strictness/correctness assist in implementation, there's also doing code sketches in hs - writing without testing - and then asking for whatever code as inspired by / in the spirit of / based on the reference sketch.
[3 hidden]5 mins ago
With LLMs that’s not a terrible approach. They are generally very good at translating between programming languages.
[3 hidden]5 mins ago
I write Haskell every day, both for work and in my free time. Without commenting on the general quality of LLM generated code, my experience is that Haskell is at least as good as any other language for LLM code gen.
[3 hidden]5 mins ago
I do AI research and mostly work with Lean these days. I love Haskell, though I wouldn't consider myself a particularly strong Haskell programmer (just never spent a ton of time working in it). I think you're spiritually correct that there are lots of reasons to use extremely strict languages with AI, but the reality is a little messier than you'd expect.
Token efficiency is specifically the place where strict languages get a little trickier. With dynamic languages where the model has a ton of training data, like Python, the agents are really good at writing code that just works. You still have challenges there, but they're just different than the challenges you hit with a language like Haskell/Lean/Agda etc. With Lean, for example, the amount of things the agent decides it needs to prove for a relatively trivial operation can lead to an absurd amount of code. And the way it decides to prove them can be borderline labyrinthian. It sort of plays perfectly towards current agent weaknesses, where agents can run off and reinvent a lot of machinery and build unnecessarily complex abstractions.
And those iterations have a cost. Even if the final artifact is more terse, the path to getting there can involve a huge amount of backtracking and rewriting and off-by-one syntactic corrections.
Ultimately, a lot of this comes down to developer experience. Getting useful error messages for the agent, having fast compile times so that the agent can iterate quickly, providing useful utilities for debugging, etc. There was a popular blog post specifically about Haskell that generally makes this point--the Haskell language is, in a vacuum, ideal in a lot of ways for AI, but the Haskell developer experience and ecosystem made it hard for this team to build with it via agents: https://avi.press/posts/2026-07-10-after-7-years-in-producti...
Note: I am not advocating against using these kinds of language. Obviously, I still work in Lean and a little in Agda and some related languages/projects, so I think this direction is right. Probably biased in that I love them with or without LLMs, but I do think they're also more ideal for AI development. There are still just challenges in getting agents productive in them, and most of the challenges are not about the type systems but the actual ergonomics and dev experience.
[3 hidden]5 mins ago
I'm wondering the inverse, actually. That LLMs can make regular haskell programming (e.g. typing in code, not english that LLMs convert to code) powerful enough to prefer. Can we have LLMs do enough of the grunt work on building type machinery, dealing with compiler errors, looking up exact types and conversion systems, to make the APIs presented to us preferable?
So, I could write what I want in haskell, and it's faster for me than to have an LLM do it. The haskell would be high-level enough and precise enough to describe what I want the program to do with less iterations than I'd have with an LLM writing code, finding its own bugs, fixing them, then having me ask it what it did, tell it what to do differently, etc.
Direct control is very powerful. LLMs take that away from us, in exchange for a great speedup. But perhaps we can use LLMs to give it back to us by making our actual programming languages more powerful.
[3 hidden]5 mins ago
Yeah, I think this is roughly where things are headed. Or at least, it's part of what I'm working on these days, though I'd characterize myself as "generally kind of bad at things," so maybe that's anti-signal.
But I think this is actually in the design of many languages already, especially in languages like Lean, where you can prove that the presentable API is correct.
Here's one rough example that is related to this direction:
A common convention in Lean is to write essentially two versions of a function, with a theorem proving their equality or correspondence.
So you can write a more demonstrative version that is more easily understood, which you can treat sort of as a spec that all other implementations must satisfy. And then you can set the agent loose to do whatever nastiness it wants to do to improve performance.
> I think you're spiritually correct that there are lots of reasons to use extremely strict languages with AI
> With dynamic languages where the model has a ton of training data, like Python, the agents are really good at writing code that just works.
I'm confused how the former supports the latter here.
Surely, you mean that LLMs are not the right kind of "AI". Languages like Haskell expose how fundamentally porous LLMs are with information.
I wouldn't even say it's the dynamic nature of Python that leads to good results, but the consistency. Javascript is the obvious counterexample. There's far more javascript out there to train on than any other programming language, yet LLMs are terrible at writing it too.
[3 hidden]5 mins ago
Just reading chain of thought traces for Agda (I'm using Qwen 3.8-Flash-Next) and it's struggling so hard with just the syntax, long before it can struggle with semantics or type errors.
Admittedly I'm not much better, Agda has some crazy scoping rules at times and its operators are a mess, so much worse than Haskell, but at least I don't have to re-learn from scratch after every compaction.
[3 hidden]5 mins ago
Yeah I know this pain. I actually have had some success by giving the agent a style guide for Lean that is strictly not conventional. The nice syntactic shortcuts and different modes that make Lean more ergonomic for humans, in my experience, actually make it easier for an agent to trip itself up.
[3 hidden]5 mins ago
It's as popular as you make it. Nothing is stopping you from using it. People generate code for what they are familiar with or have desire for. There are people who have wanted to give rust a try and AI opens that possibility up. There are certainly less people that want to try Haskell. Furthermore, Rust has more training data so LLMs generally will provide better Rust code than Haskell code. Because of LLM, I'm back into obscure languages that I didn't have the mental capacity to carry day by day. Prolog, Lisp and Forth, and like you said, they are very terse and token efficient. However, I must point out that terse was only relevant prior to the entire thinking era, a model could use 100k tokens to think only to give you 100 tokens of final output.
[3 hidden]5 mins ago
I've been generating probably 500k lines of Rust with all the SOTA models (and now DeepSeek). Every model does an absolutely horrible job generating good Rust code. You have to babysit it and you need to question everything the model spat out.
I mean, free functions and no general nice trait/struct/enum based architecture, random `Mutex`/`RwLock` everywhere, all your big futures inside a `tokio::select!` etc.
Yes it's great when you do your first Rust project. After a year it's a nightmare if you don't keep a clear control how the code is generated and organized.
[3 hidden]5 mins ago
The popularity or the lack thereof has nothing to do with AI. AI writes good Haskell code, certainly not worse than much more popular languages like Python.
But I just don’t think terseness matters much; most of the cost is spent on reasoning tokens, not the sheer volume of code output.
[3 hidden]5 mins ago
One "did not compile, fix error, try again" loop takes so many tokens, that a well-trained-on lang like JS/Py/Bash/C easily outperforms a strict one.
The benefits of strict are still the same: once the code grows bigger you have alll kinds of guarantees built into the software, that JS/Py/Bash/C needs lots of test achieve the same.
Since writing code is cheap, it like to go more on the tests and the strong typing, simply because it is so cheap. Why write Ruby/Py/JS when you can write Haskell/Kotlin/Rust? There's simply no reason not to be doing TDD these days.
[3 hidden]5 mins ago
It's not more popular because Dan Luu actually measured this [1] and those languages aren't better in practice.
A priori, it does seem strange. But the relative Haskell vs Python tokens in the internet go a long way to explaining it, as another commenter has said.
Haskell does not have a good low level library wrappers story, unlike Rust.
Nobody prepared it for adoption nearly as much as Rust evangelists did for their language. Years of hard work they invested into maintaining bindings as hobby projects paid off.
[3 hidden]5 mins ago
People care a lot more about Rust-C++ interop because people expect to replace C++ with Rust. People don’t care as much about Haskell-C++ interop, so in the end people just rely on C ABI because it’s the lowest common denominator. If your low level library has a C interface, Haskell works very fine. Some people even prefer the OpenSSL C library over Haskell-native TLS.
[3 hidden]5 mins ago
Businesses care. I worked with Haskell in production (a fairly normal B2B SaaS). Some things you would expect to have in the ecosystem had to be maintained domestically.
My former company was generous enough to publish most of these[0] as open source projects. But what's really telling is that oftentimes vendoring a commonly used OSS library was unavoidable.
The ideal language for the AI has very short feedback loops with highly localized errors and minimal up front reasoning about types that itself provides a surface for flailing and errors. I'm not familiar enough with haskell to say for sure but I don't think this describes the language very well.
The ideal language for the engineer driving the agent has maximum comprehensibility, since review and understanding are the real bottlenecks now. I'm also pretty sure this doesn't describe haskell. It incompletely describes rust I think.
It does describe ocaml. And also gleam and maybe scala. And moonbit, developed by someone who is a proven expert in exactly this domain and explicitly targeting this problem space.
[3 hidden]5 mins ago
Yet, "short feedback loops with highly localized errors" is exactly what Haskell is. You can start Haskell in interpreter mode (ghci) and you get instant feedback. Errors are always localized. Although my experience with claude in the last few months shows that it rarely hits a compilation error at all.
[3 hidden]5 mins ago
The most interesting idea in this space I have heard is to have LLMs generate formally verified assembly. And then from that assembly generate higher levels projections in languages like Haskell to help the human understanding.
[3 hidden]5 mins ago
It's not going to work. Formally verified assembly needs a low level spec which is comparable in length to the assembly code, so not really comprehensible.
"higher level projections" - wtf is this even about?
[3 hidden]5 mins ago
> Rust is getting additional adoption because of its strictness
That's doubtful. It's not strict in any way that matters, especially when LLMs are writing it. You still have to rely on tests for everything. The languages that are strict are still largely ignored.
It is seeing adoption because of a well executed advertising campaign combined with "C++ without the dependency hell" being a real value proposition.
[3 hidden]5 mins ago
There is this memo video of S. P. Jones that famously says "Haskell is Useless". I love Haskell, but I wished it was universal like C, C++, JavaScript, Rust, and C#. By that I mean: It could be used to create apps for desktop, mobile, and web. JavaScript can be used to do so many things like power the entire web, be on node and let anyone create cli and share the code with web, and mobile through React Native, on desktop with Electron and its alike things, it lets you do plugins for god knows how many things, it lets you write things for the GNOME Shell... C and C++ are perhaps behind everything in the world and string theory finally gets seen will see they are written in C. And they can be compiled to Web and almost everything in the world. Rust is a placeholder for the two, and C# reinvented itself when it saw Mono and now works even in the browser. Each time I see Haskell I wonder what else can I do rather than creating CLI apps, and it makes me choose something else that grants me more code reuse and interesting applications.
If I could have a vision for Haskell, it was for it to be useful. Academic research and making compilers is cool, a few cli things here and there are cool too, but why can't we build music players and game engines and flutters and web pages with it? The language is way more elegant and beautiful than all the JS/C like languages out there and I really wished I could use it for the things I did. I'm aware of Servant/Yesod/IHP/Miso/Reflex for web, GTK/Monomer for desktop, TidalCycles for music, SDL/gloss for games, and various FFI/plugin, but none of them feel as coherent and worked on as the others, none of them are polished. Haskell surely needs good DX, but it also needs really better reasons for existing.
[3 hidden]5 mins ago
> There is this memo video of S. P. Jones that famously says "Haskell is Useless".
I think that is an unfair characterization of the video and the intent of Haskell's co-creator, based on the rest of your comment. Simon Peyton Jones makes a graph with two dimensions, useful/useless and safe/unsafe. The question he gets at is: how can one distinguish between effectful and effect-free computations in a programming language? He proceeds to characterize most useful languages as unsafe, and Haskell as useless but safe. He then spends the majority of the video talking about how useful languages are becoming safer, and at the same time how Haskell must become useful.
I've loved this video for years, primarily because of SPJ's willingness (and excitement, even) to talk about Haskell's shortcomings. I think SPJ and other important people in the Haskell community are keenly aware that Haskell appeals to a specific demographic and that, to survive as more than just a research plaything, that they need to broaden participation.
The famously friendly "Learn You a Haskell" book features its first "helloworld" program deep into the middle of the book, _after_ functors and (if I recall correctly) monads. It takes a very special beginner programmer to push that far through, working in the REPL, before they can write programs that do basic I/O.
I teach functional programming to college sophomores and juniors, and I would love to teach them Haskell. But I have to meet them where they are, and it would be difficult to do in Haskell. This is why we have taught either F#, Scala, or LISP over the years. F# in particular has a lot of the aesthetic qualities of Haskell while allowing impurity or mutability escape hatches without too much trouble. If somebody has truly beginner-friendly Haskell resources, I would love to hear about it-- I'm apparently not smart enough to chart that path myself.
[3 hidden]5 mins ago
Great video! Thanks for the link.
It is important to clearly understand that Simon uses the word "useless" in the sense of having no side-effects on the external world i.e. if state changes are not reflected in the external world at some point then there is no practical purpose to it and hence "useless".
Functional languages solved this by using the type system at different levels to combine both effectful and effect-free computations cleanly.
[3 hidden]5 mins ago
> It could be used to create apps for desktop, mobile, and web
Haskell can 100% be used to create all of these kinds of apps.
[3 hidden]5 mins ago
But expect to be in pain when not web.
[3 hidden]5 mins ago
It's really hard to be the best at every platform, and at every problem area. Especially at the start. But once you have dominance in some niche, that may give you the power/possibility to dominate other niches.
I think this article tries to figure out where can Haskell be the best.
As for a platform? If Haskell can offer the most secure, correct, and trusted web apps(the biggest platform), created with the help of LLM's, and they can use LLM's to make reading Haskell intuitive, that's a good place.
[3 hidden]5 mins ago
> Functional programming should not be viewed as a tuxedo that we dust off and use when we want to be "fancy programmers." It's simply a tool in the toolbox.
It sounds like it needs foundational libraries? Or is it something else. For example, almost everything I write requires one or more of:
- Embedded toolchain and/or HAL/register map for my MCU family or CPU arhitecture
- A GUI library and/or basic I/O interaction library (keyboard/mouse to start)
- A GPU interaction library
- A web framework (Not going to roll my own DB interface, auth, user system, router, template system etc)
(Etc). I.e., some core library which handles the drudgery I can build my application on. If this is what you're getting at, this suggests a plan of attack!
[3 hidden]5 mins ago
Embedded toolchain and/or HAL/register map:
- Copilot (by NASA)
- MicroHs — for running Haskell on an MCU
GUI library and/or basic keyboard/mouse I/O:
- Monomer
- sdl2
- gi-gtk4
GPU interaction library
- OpenGL bindings
- vulkan bindnigs
- Accelerate — numerical GPU computation with an NVIDIA backend.
Web framework with database access, auth, users, routing, and templates:
- IHP
- Yesod
[3 hidden]5 mins ago
Pretty sure those all exist; e.g. at work we use Yesod and Servant, which are a couple of Haskell web frameworks.
[3 hidden]5 mins ago
whats holding you back? buy claude pro and make it reality, hell im gonna give it try because your comment offends me
[3 hidden]5 mins ago
So what's missing? GUI libraries?
[3 hidden]5 mins ago
Nothing is really missing, Haskell can do all of that.
[3 hidden]5 mins ago
I thought so. What's the reason for the PR problem, then?
[3 hidden]5 mins ago
I can only speak from my own experience, but expressing a program as a composition of pure functions, where effects are carefully managed, is a challenging way of thinking at first. The imperative approach really is simpler to wrap one's head around _until you start worrying about correctness_. I think many developers never really care that deeply, so Haskell never appeals to them. You really do have to take a mathematical approach to program construction. I personally think that the mathematical perspective is liberating, but it's not an easy one to cultivate.
[3 hidden]5 mins ago
hasufell has been a wonderful person in haskell land. hes got very clear headed ideas about stuff and so forth.
also the stuff i can now build in haskell with computer aid is epic. earlier this week i stood up what i believe is one of the/ if not the: best step file format reader writer on like every axis. some c ones are 20-30 percent faster on the largest possible cad assemblies i could try out.
an important axis that folks neglect to consider: the main way llms are getting scaled up for better coding is metric megatons of reinforcement learning traces, and type checking thats fancy gives a cheaper and faster training feedback loop.
with an llm as a sortah insane manic intern im looking over the shoulder, so to speak, im able to build the apis and designs i can see but cant type anywhere near the same scale. but i can specify the keystones for the exact designs quite compactly and then the agent kinda acts as a compiler inhave to correct and iterate running
[3 hidden]5 mins ago
RE the debugging experience in Haskell: we recently wrote a post about bringing live run-time debugging to our Haskell VR compositor: https://simulavr.com/blog/debug-hud/
Live step-through debugging and interactivity we think is pretty underrated in the Haskell ecosystem.
[3 hidden]5 mins ago
While I agree compile time is a big issue, I think the focus should really be on incremental build, because considering how much work the Haskell compiler has to do, it is expected to be quite slow on full build.
But incremental build has no reason to be slow, if the scope is as fine-grained as the function and type level.
[3 hidden]5 mins ago
It doesn't have enough marginal value add on top of competitors like Rust. There are other more significant synergies with coding agents that are getting attention instead, like autonomous formal verification. Languages like Lean enable an entirely new category of engineering, and Haskell just doesn't. So it's stuck in a difficult middle where it's too different to justify relative to its gains, but not different enough to capture the new opportunities emerging.
[3 hidden]5 mins ago
Just like Ruby was IMHO a "simple" lang carved out of Perl;
Elm is a "simple" lang carved out of Haskell.
Some languages are here merely to inspire others.
Not that Elm is such a success... But it is "simple" (Haskell and Perl are not; they big).
[3 hidden]5 mins ago
I remember when Charles Hoskinson announced that smart contracts on his crypto platform Cardano / Plutus would use Haskell.
It just didn't get anything like the adoption that Solidity had at the time.
[3 hidden]5 mins ago
That's not the reason Cardano failed though. All the capital had already established itself on other platforms and "it uses a better language" wasn't enough of an incentive to switch. It's an overwhelmingly common story in that ecosystem, even with other networks that Solidity can target.
[3 hidden]5 mins ago
I don't know what it takes to write (or wire up) a smart contracts language, but when I, as someone past beginner level, looked up the Cardano docs on how to build contracts I was mega confused and had no clear way how to get started.
[3 hidden]5 mins ago
> the onboarding experience of rust
> we are going to build the best onboarding experience in the programming language ecosystem
> This can only be done if we commit to unix principles
> write programs that do one thing and do it well
Rust is so approachable because Cargo does not subscribe to "do one thing".
In fact Cargo does a bunch of things. Which is very convenient for newcomers, because they only need to learn one thing instead of a bunch (and how they interact).
The same holds for a GUI like a file explorer with buttons and interactions like drag / drop or marquee select, which is a bunch simpler than chaining 3 programs together to delete 30 old files and move some folder into a subdirectory.
It also explains why the most successful tools within the land of Unix philosophy are stuff like AWK, which really don't just do one thing. Or why PowerShell is less usable than GNU. Or why Emacs is an 'operating system'.
It's also a reason why the installation experience for Haskell is so bad: there are a bunch of programs and users don't know where to start and what they need.
> Cabal and Stack: which one should I install?
> We recommend installing both.
One thing and one thing well.
Atleast it seems they've added a combined installer for these tools since the last time I've checked.
[3 hidden]5 mins ago
I disagree. About a decade ago I made some tooling to extract and analyse code from Haskell packages. That's easier said than done, given the use of pre-processors, TemplateHaskell, language extensions affecting the syntax/grammar, using external files like `.cabal` to specify such pre-processors/extensions, etc.
I went through several iterations, to get something that I could throw arbitrary packages at from Hackage, GitHub, etc. The result was a hacky mess containing a GHC plugin to dump Core code, a library to dynamically generate and evaluate strings of Nix to handle dependencies, shell scripts that piped `:t` commands through GHCi, and so on.
It was annoying, not because of the effort involved (I was doing weird, bespoke things; so it's no surprise it needed weird, bespoke code to be written); but because all of the functionality I needed already existed, just buried deep inside GHC/Cabal/etc.
Admittedly the GHC API has gotten much better in recent years; but there's no way the developers of "one tool to rule them all" can predict all of the different things that users will want it to do. Indeed, it's probably wise for such tools to avoid supporting/maintaining particularly weird/niche uses!
Having a collection of tools instead, which "do one thing and do it well", side-steps that problem entirely: users with weird use-cases are empowered to plug things together in a way that suits their needs, without needing the devs to add special features/flags just for them (or maintain their own forks with such flags, etc.)
[3 hidden]5 mins ago
They’re pitching a tall order. First they will need to convince the masses that code should be understood.
[3 hidden]5 mins ago
That seems like a losing proposition in these times.
[3 hidden]5 mins ago
Sooo they are fixing how you install Haskell? :D
[3 hidden]5 mins ago
How this was ever a problem ? and today we have ghcup, stack and nix
[3 hidden]5 mins ago
That's the problem!
If I'm on NixOS, should I be installing via ghcup, stack, or nix?
[3 hidden]5 mins ago
The Haskell ecosystem seems obsessed with NixOS in a way I haven't seen anywhere else.
I recall wanting to use Haskell packages that were only available in Nix, but nobody had bothered to make just a normal package.
[3 hidden]5 mins ago
If you want to create an ecosystem optimized towards correctness, you'll have to curate what you let inside, and drop many things. And Nix is probably the best package manager for correctness.
That of course hurts market share.
[3 hidden]5 mins ago
There is no correct, only pros and cons. How you weight the pros and cons will not be the same as everyone else.
[3 hidden]5 mins ago
To be fair, that’s a general problem on NixOS (and other OSes), and one that tools like devenv have tried to solve. You can take what’s included with OS packages, but then you’re stuck with whatever version that is.
[3 hidden]5 mins ago
> You can take what’s included with OS packages, but then you’re stuck with whatever version that is.
It's pretty easy to override things in Nixpkgs though, whether at the system level, or for one application, or just a particular dependency deep in the tree of one script.
Nixpkgs has a bunch of powerful functions to make this easier, e.g. callCabal2nix, makePackageSet, etc.
Is it even possible for Haskell to have compilation times similar to Go, given the language semantics?
[3 hidden]5 mins ago
It is definitely possible for incremental compilation, but requires more work in that area. It is possible today in interpreter mode.
[3 hidden]5 mins ago
In before a certain defense tech engineer in 3...2...1
[3 hidden]5 mins ago
> Beginners: the onboarding experience must be our benchmark for usability
OK, so I put this into Gemini:
"show me a non-trivial haskell function and type signature with at least five distinct arguments"
And I get:
---
processRecord :: (a -> b) -> Maybe c -> [d] -> (e -> Bool) -> (b, c, [d], e) -> Either String (b, c, [d], e)
processRecord transform mVal items pred (bVal, cVal, dList, eVal)
| pred eVal = Right (transform (const bVal undefined) mVal, cVal, dList, eVal) -- simplified example logic
| otherwise = Left "Predicate failed on the fifth argument"
---
My brain just crashes after the "::".
For the beginner, there isn't enough syntax on offer to discern who's doing what to whom here.
Is there a "function signatures for dummys" somewhere?
[3 hidden]5 mins ago
Your brain crashes just because of unfamiliarity with the syntax. Just mentally translate it into C++ or Rust syntax.
This familiarity can be gained in frankly a day or two of trying, and afterwards you’ll find it to be clear and information dense. The example doesn’t even involve anything truly mind blowing for a beginner yet, like the Traversable class, the lens/traversal/prism signatures, or polymorphic recursion.
[3 hidden]5 mins ago
Huh? How would that be a good criteria - how many languages exist where a non-user can easily grok non trivial functions with at least five distinct arguments?
If someone told me German was easy to learn, I wouldn’t get an LLM to generate me a complex sentence with two clauses and three adjectives and then be like “sure about that?”
`processRecord :: (a -> b) -> Maybe c -> [d] -> (e -> Bool) -> (b, c, [d], e) -> Either String (b, c, [d], e)`
Says:
“
give me:
1) a function of a to b,
2) a ‘c’ wrapped in a Maybe,
3) a list of d’s,
4) a function of e to a Bool,
5) a 4 tuple of a, b, list of d’s, and an e
And I will give you either a String or your original tuple back”
It doesn’t really do anything so there’s not much more to explain
[3 hidden]5 mins ago
If you read the most introductory guide of Haskell, or ask your LLM to explain, you'll find there's nothing mystifying about the syntax you quoted. You're just unfamiliar with it because you didn't do the bare minimum effort.
If I ask my grandma what she thinks of the supposedly easy Python syntax, or C-style curly braces, her brain would similarly crash. Unless she read an intro to Python or C first.
In other words, do not confuse "I'm unfamiliar with this because it doesn't resemble what I know" with "hard to understand".
[3 hidden]5 mins ago
> For the beginner, there isn't enough syntax on offer to discern who's doing what to whom here.
If you throw a beginner at any non-trivial code in any language without teaching them anything about the language, then, yeah, it'll be hard for them to figure it out. That says nothing about the language itself, though. That's pretty obvious to everybody.
> Is there a "function signatures for dummys" somewhere?
Yeah, of course. There's actual beginner material, here's one example:
yeah ive never heard anyone say they like doing productive coinduction in lean. agda almost has a story, but the ergonomics and semantics arent trivial.
An ideal language for agentic AI I would think is extremely strict, where the AI can iterate over the tooling for correctness. It would probably be less verbose and more terse to allow the AI to be more efficient with tokens.
In fact if I have to ship in a different language, I'll often do a Haskell version first to steer towards isolating IO, enforcing referential transparency, and generally picking up other functional patterns that are a good idea no matter what. Then I'll port the Haskell version to whatever the solution demands.
As lower-hanging fruit, to get some style steering, but not the strictness/correctness assist in implementation, there's also doing code sketches in hs - writing without testing - and then asking for whatever code as inspired by / in the spirit of / based on the reference sketch.
Token efficiency is specifically the place where strict languages get a little trickier. With dynamic languages where the model has a ton of training data, like Python, the agents are really good at writing code that just works. You still have challenges there, but they're just different than the challenges you hit with a language like Haskell/Lean/Agda etc. With Lean, for example, the amount of things the agent decides it needs to prove for a relatively trivial operation can lead to an absurd amount of code. And the way it decides to prove them can be borderline labyrinthian. It sort of plays perfectly towards current agent weaknesses, where agents can run off and reinvent a lot of machinery and build unnecessarily complex abstractions.
And those iterations have a cost. Even if the final artifact is more terse, the path to getting there can involve a huge amount of backtracking and rewriting and off-by-one syntactic corrections.
Ultimately, a lot of this comes down to developer experience. Getting useful error messages for the agent, having fast compile times so that the agent can iterate quickly, providing useful utilities for debugging, etc. There was a popular blog post specifically about Haskell that generally makes this point--the Haskell language is, in a vacuum, ideal in a lot of ways for AI, but the Haskell developer experience and ecosystem made it hard for this team to build with it via agents: https://avi.press/posts/2026-07-10-after-7-years-in-producti...
Note: I am not advocating against using these kinds of language. Obviously, I still work in Lean and a little in Agda and some related languages/projects, so I think this direction is right. Probably biased in that I love them with or without LLMs, but I do think they're also more ideal for AI development. There are still just challenges in getting agents productive in them, and most of the challenges are not about the type systems but the actual ergonomics and dev experience.
So, I could write what I want in haskell, and it's faster for me than to have an LLM do it. The haskell would be high-level enough and precise enough to describe what I want the program to do with less iterations than I'd have with an LLM writing code, finding its own bugs, fixing them, then having me ask it what it did, tell it what to do differently, etc.
Direct control is very powerful. LLMs take that away from us, in exchange for a great speedup. But perhaps we can use LLMs to give it back to us by making our actual programming languages more powerful.
But I think this is actually in the design of many languages already, especially in languages like Lean, where you can prove that the presentable API is correct.
Here's one rough example that is related to this direction:
A common convention in Lean is to write essentially two versions of a function, with a theorem proving their equality or correspondence.
So you can write a more demonstrative version that is more easily understood, which you can treat sort of as a spec that all other implementations must satisfy. And then you can set the agent loose to do whatever nastiness it wants to do to improve performance.
Here's a fun write up from someone doing just this with zip file compression: https://kim-em.github.io/blog/2026-7-24-why-lean-is-faster-t...
> With dynamic languages where the model has a ton of training data, like Python, the agents are really good at writing code that just works.
I'm confused how the former supports the latter here.
Surely, you mean that LLMs are not the right kind of "AI". Languages like Haskell expose how fundamentally porous LLMs are with information.
I wouldn't even say it's the dynamic nature of Python that leads to good results, but the consistency. Javascript is the obvious counterexample. There's far more javascript out there to train on than any other programming language, yet LLMs are terrible at writing it too.
Admittedly I'm not much better, Agda has some crazy scoping rules at times and its operators are a mess, so much worse than Haskell, but at least I don't have to re-learn from scratch after every compaction.
I mean, free functions and no general nice trait/struct/enum based architecture, random `Mutex`/`RwLock` everywhere, all your big futures inside a `tokio::select!` etc.
Yes it's great when you do your first Rust project. After a year it's a nightmare if you don't keep a clear control how the code is generated and organized.
But I just don’t think terseness matters much; most of the cost is spent on reasoning tokens, not the sheer volume of code output.
The benefits of strict are still the same: once the code grows bigger you have alll kinds of guarantees built into the software, that JS/Py/Bash/C needs lots of test achieve the same.
Since writing code is cheap, it like to go more on the tests and the strong typing, simply because it is so cheap. Why write Ruby/Py/JS when you can write Haskell/Kotlin/Rust? There's simply no reason not to be doing TDD these days.
A priori, it does seem strange. But the relative Haskell vs Python tokens in the internet go a long way to explaining it, as another commenter has said.
[1] https://danluu.com/pl-tokens/
I used prolog for a project and GPT 6.1 Sol repeatedly made dumb mistakes as if it doesn’t understand the symbolic resolution capabilities.
For vibe coded Haskell id not be surprised to see it just not use strict types, hucking strings around
Looks like the claim is true that Sol sucks at the long tail of languages (vs. battle opponents). https://micjm.com/blog/gpt-6.1-sol-long-tail-languages/
Nobody prepared it for adoption nearly as much as Rust evangelists did for their language. Years of hard work they invested into maintaining bindings as hobby projects paid off.
My former company was generous enough to publish most of these[0] as open source projects. But what's really telling is that oftentimes vendoring a commonly used OSS library was unavoidable.
[0] Here's a potentially incomplete list: https://chatgpt.com/s/t_6af76fd8f2a081918fa37f8c30bdb3ba
The ideal language for the engineer driving the agent has maximum comprehensibility, since review and understanding are the real bottlenecks now. I'm also pretty sure this doesn't describe haskell. It incompletely describes rust I think.
It does describe ocaml. And also gleam and maybe scala. And moonbit, developed by someone who is a proven expert in exactly this domain and explicitly targeting this problem space.
"higher level projections" - wtf is this even about?
That's doubtful. It's not strict in any way that matters, especially when LLMs are writing it. You still have to rely on tests for everything. The languages that are strict are still largely ignored.
It is seeing adoption because of a well executed advertising campaign combined with "C++ without the dependency hell" being a real value proposition.
If I could have a vision for Haskell, it was for it to be useful. Academic research and making compilers is cool, a few cli things here and there are cool too, but why can't we build music players and game engines and flutters and web pages with it? The language is way more elegant and beautiful than all the JS/C like languages out there and I really wished I could use it for the things I did. I'm aware of Servant/Yesod/IHP/Miso/Reflex for web, GTK/Monomer for desktop, TidalCycles for music, SDL/gloss for games, and various FFI/plugin, but none of them feel as coherent and worked on as the others, none of them are polished. Haskell surely needs good DX, but it also needs really better reasons for existing.
I think that is an unfair characterization of the video and the intent of Haskell's co-creator, based on the rest of your comment. Simon Peyton Jones makes a graph with two dimensions, useful/useless and safe/unsafe. The question he gets at is: how can one distinguish between effectful and effect-free computations in a programming language? He proceeds to characterize most useful languages as unsafe, and Haskell as useless but safe. He then spends the majority of the video talking about how useful languages are becoming safer, and at the same time how Haskell must become useful.
https://youtu.be/iSmkqocn0oQ
The famously friendly "Learn You a Haskell" book features its first "helloworld" program deep into the middle of the book, _after_ functors and (if I recall correctly) monads. It takes a very special beginner programmer to push that far through, working in the REPL, before they can write programs that do basic I/O.
I teach functional programming to college sophomores and juniors, and I would love to teach them Haskell. But I have to meet them where they are, and it would be difficult to do in Haskell. This is why we have taught either F#, Scala, or LISP over the years. F# in particular has a lot of the aesthetic qualities of Haskell while allowing impurity or mutability escape hatches without too much trouble. If somebody has truly beginner-friendly Haskell resources, I would love to hear about it-- I'm apparently not smart enough to chart that path myself.
It is important to clearly understand that Simon uses the word "useless" in the sense of having no side-effects on the external world i.e. if state changes are not reflected in the external world at some point then there is no practical purpose to it and hence "useless".
Functional languages solved this by using the type system at different levels to combine both effectful and effect-free computations cleanly.
Haskell can 100% be used to create all of these kinds of apps.
I think this article tries to figure out where can Haskell be the best.
As for a platform? If Haskell can offer the most secure, correct, and trusted web apps(the biggest platform), created with the help of LLM's, and they can use LLM's to make reading Haskell intuitive, that's a good place.
https://news.ycombinator.com/item?id=15486063
- Copilot (by NASA)
- MicroHs — for running Haskell on an MCU
GUI library and/or basic keyboard/mouse I/O:
- Monomer
- sdl2
- gi-gtk4
GPU interaction library
- OpenGL bindings
- vulkan bindnigs
- Accelerate — numerical GPU computation with an NVIDIA backend.
Web framework with database access, auth, users, routing, and templates:
- IHP
- Yesod
also the stuff i can now build in haskell with computer aid is epic. earlier this week i stood up what i believe is one of the/ if not the: best step file format reader writer on like every axis. some c ones are 20-30 percent faster on the largest possible cad assemblies i could try out.
an important axis that folks neglect to consider: the main way llms are getting scaled up for better coding is metric megatons of reinforcement learning traces, and type checking thats fancy gives a cheaper and faster training feedback loop.
with an llm as a sortah insane manic intern im looking over the shoulder, so to speak, im able to build the apis and designs i can see but cant type anywhere near the same scale. but i can specify the keystones for the exact designs quite compactly and then the agent kinda acts as a compiler inhave to correct and iterate running
Live step-through debugging and interactivity we think is pretty underrated in the Haskell ecosystem.
But incremental build has no reason to be slow, if the scope is as fine-grained as the function and type level.
Some languages are here merely to inspire others.
Not that Elm is such a success... But it is "simple" (Haskell and Perl are not; they big).
It just didn't get anything like the adoption that Solidity had at the time.
> we are going to build the best onboarding experience in the programming language ecosystem
> This can only be done if we commit to unix principles > write programs that do one thing and do it well
Rust is so approachable because Cargo does not subscribe to "do one thing". In fact Cargo does a bunch of things. Which is very convenient for newcomers, because they only need to learn one thing instead of a bunch (and how they interact).
The same holds for a GUI like a file explorer with buttons and interactions like drag / drop or marquee select, which is a bunch simpler than chaining 3 programs together to delete 30 old files and move some folder into a subdirectory.
It also explains why the most successful tools within the land of Unix philosophy are stuff like AWK, which really don't just do one thing. Or why PowerShell is less usable than GNU. Or why Emacs is an 'operating system'.
It's also a reason why the installation experience for Haskell is so bad: there are a bunch of programs and users don't know where to start and what they need.
> Cabal and Stack: which one should I install? > We recommend installing both.
One thing and one thing well.
Atleast it seems they've added a combined installer for these tools since the last time I've checked.
I went through several iterations, to get something that I could throw arbitrary packages at from Hackage, GitHub, etc. The result was a hacky mess containing a GHC plugin to dump Core code, a library to dynamically generate and evaluate strings of Nix to handle dependencies, shell scripts that piped `:t` commands through GHCi, and so on.
It was annoying, not because of the effort involved (I was doing weird, bespoke things; so it's no surprise it needed weird, bespoke code to be written); but because all of the functionality I needed already existed, just buried deep inside GHC/Cabal/etc.
Admittedly the GHC API has gotten much better in recent years; but there's no way the developers of "one tool to rule them all" can predict all of the different things that users will want it to do. Indeed, it's probably wise for such tools to avoid supporting/maintaining particularly weird/niche uses!
Having a collection of tools instead, which "do one thing and do it well", side-steps that problem entirely: users with weird use-cases are empowered to plug things together in a way that suits their needs, without needing the devs to add special features/flags just for them (or maintain their own forks with such flags, etc.)
If I'm on NixOS, should I be installing via ghcup, stack, or nix?
I recall wanting to use Haskell packages that were only available in Nix, but nobody had bothered to make just a normal package.
That of course hurts market share.
It's pretty easy to override things in Nixpkgs though, whether at the system level, or for one application, or just a particular dependency deep in the tree of one script.
Nixpkgs has a bunch of powerful functions to make this easier, e.g. callCabal2nix, makePackageSet, etc.
https://nixos.org/manual/nixpkgs/stable/#haskell-overriding-...
https://github.com/NixOS/nixpkgs/blob/master/pkgs/developmen...
OK, so I put this into Gemini: "show me a non-trivial haskell function and type signature with at least five distinct arguments"
And I get:
---
processRecord :: (a -> b) -> Maybe c -> [d] -> (e -> Bool) -> (b, c, [d], e) -> Either String (b, c, [d], e)
processRecord transform mVal items pred (bVal, cVal, dList, eVal)
---My brain just crashes after the "::".
For the beginner, there isn't enough syntax on offer to discern who's doing what to whom here.
Is there a "function signatures for dummys" somewhere?
If someone told me German was easy to learn, I wouldn’t get an LLM to generate me a complex sentence with two clauses and three adjectives and then be like “sure about that?”
`processRecord :: (a -> b) -> Maybe c -> [d] -> (e -> Bool) -> (b, c, [d], e) -> Either String (b, c, [d], e)`
Says: “ give me: 1) a function of a to b, 2) a ‘c’ wrapped in a Maybe, 3) a list of d’s, 4) a function of e to a Bool, 5) a 4 tuple of a, b, list of d’s, and an e
And I will give you either a String or your original tuple back”
It doesn’t really do anything so there’s not much more to explain
If I ask my grandma what she thinks of the supposedly easy Python syntax, or C-style curly braces, her brain would similarly crash. Unless she read an intro to Python or C first.
In other words, do not confuse "I'm unfamiliar with this because it doesn't resemble what I know" with "hard to understand".
If you throw a beginner at any non-trivial code in any language without teaching them anything about the language, then, yeah, it'll be hard for them to figure it out. That says nothing about the language itself, though. That's pretty obvious to everybody.
> Is there a "function signatures for dummys" somewhere?
Yeah, of course. There's actual beginner material, here's one example:
https://learnyouahaskell.github.io/types-and-typeclasses.htm...
Not hard to find, and not the only introduction to the language that covers this material. I guess you never bothered to look, or even to ask Gemini.
-- Here you go
-- Oh my god, it's non-trivial
>Languages
>Haskell 81.9%
https://leangineer.com/blog/realworld-in-lean/
https://news.ycombinator.com/item?id=50088748
though i have thought about it.