I really like the syntax of Haskell. You can get used to it fairly quickly.
> [...] but on the other hand they encourage programmers to do literary story-telling.
Try literate Haskell. (I say this only partially tongue-in-cheek.) Really, I think that Haskell is very geared towards being read by humans. This is mostly because it's so good at gluing, that you can break your problem apart in smaller pieces in the first place.
E.g. let's look at a program that computes sqrt(2). With Haskell you can talk first about how to produce infinite list of ever better approximations:
next x = (2 / x + x) / 2
approximations = iterate next 1
and then talk about when to stop and finally give an answer later on.
It is more readable. But I wanted to stick close to the general formula [1], so that you see what's going on. It would probably have been better to write it as:
y = 2
average x1 x2 = (x1 + x2) / 2
next x = average (y/x + x)
> [...] but on the other hand they encourage programmers to do literary story-telling.
Try literate Haskell. (I say this only partially tongue-in-cheek.) Really, I think that Haskell is very geared towards being read by humans. This is mostly because it's so good at gluing, that you can break your problem apart in smaller pieces in the first place.
E.g. let's look at a program that computes sqrt(2). With Haskell you can talk first about how to produce infinite list of ever better approximations:
and then talk about when to stop and finally give an answer later on. In a strict language, you usually intermingle producing new values with watching out for the ending condition: Python's generators help, but they are more restricted. (Which is intended, Python wants to stay simple.)