Adressing the whitespread conception "It is hard to programm in Haskell because it is pure": If you can write python, you can write Haskell. Don't believe me? 1. Write your program completely in the IO Monad, in a huge do-block 2. Factor out as much pure functionality as possible (= Have as little code in your big IO-programm as possible.) Start at 1. and iterate 2. as many times as you please. It will already be a p…
What Haskell did with Monads is nice, but eventually Monads are just tags on what functionality the function uses. That being said, I like that Nim and Koka did exactly that. You just tag the functions (IO, Async, Whatever) and it works. In Haskell, you need monad transformers (which have a runtime costs) or whatever else was made to allow you to work with multiple different effects.
As monad is just an interface, it doesn't necessary cause runtime costs. Identity is a monad too. Effects may not always require sacrificing performance, but as they can be used to implement exceptions they are not just free compile time annotations. Also the differences discussed there: https://www.reddit.com/r/haskell/comments/3nkv2a/why_dont_we...