"The concurrency stories for Erlang and Go are front and center, very well defined, and obvious."
GHC Haskell basically have the same concurrency story (since ghc 7.0.1 - 16 November 2010 [1]):
- You can start ten or even hundred thousands of threads
- Inside them you can program like having synchronous I/O
- And the runtime handles it efficiently (with epoll/kqueue/...)
The difference is that haskell is less opinionated on the high level concurrency primitives, so you have many choices (sometimes with multiple different library implementations) like: locking, explicit async code, transactional memory, channels... https://hackage.haskell.org/packages/#cat:Concurrency
[1] Release Notes: "On POSIX platforms, there is a new I/O manager based on epoll/kqueue/poll, which allows multithreaded I/O code to scale to a much larger number (100k+) of threads" https://downloads.haskell.org/~ghc/7.0.1/docs/html/users_gui...