My issue with “pure” functional programming languages, and I’m speaking with a sample size of one here (Haskell), is that Monads and I/O seem comically difficult to use or explain. It’s possible that I just haven’t put in the hours reading through long detailed explanations of these concepts, and that if I did it’d “click” and I’d never have to think about them again,
Fwiw, yeah, this is basically how it went for me. Or, well, maybe not so much “reading through long detailed explanations” as “reading through through long detailed compilation errors” (though I’m sure I did both). Actually trying to use them seems probably important, not just reading about them. But yeah, I’d say that by now they seem intuitive to me, to the point where I had to resist adding my own attempt at a monad primer to this comment, and I only occasionally have to think in detail about them.
(Also, not really important, but this is more about the type system than about being a pure functional language. I don’t recommend using Elm for anything serious, but that has a similar-but-weaker type system without monads or (in some important sense) IO, while remaining purely functional. Early versions of Haskell didn’t have monads or (in the same sense) IO either.)
Fwiw, yeah, this is basically how it went for me. Or, well, maybe not so much “reading through long detailed explanations” as “reading through through long detailed compilation errors” (though I’m sure I did both). Actually trying to use them seems probably important, not just reading about them. But yeah, I’d say that by now they seem intuitive to me, to the point where I had to resist adding my own attempt at a monad primer to this comment, and I only occasionally have to think in detail about them.
(Also, not really important, but this is more about the type system than about being a pure functional language. I don’t recommend using Elm for anything serious, but that has a similar-but-weaker type system without monads or (in some important sense) IO, while remaining purely functional. Early versions of Haskell didn’t have monads or (in the same sense) IO either.)