Eu acho que uma coisa em que você provavelmente está se deparando é algo que eu também encontrei ao aprender programação funcional, que é que, com a programação funcional, você pode (e quase precisa) pensar / trabalhar em um nível mais alto do que na programação imperativa.
O que você acha menos expressivo, acho que é realmente mais expressivo: você não precisa explicar todos os detalhes e pode fazer mais com menos código na programação funcional - há mais poder no que você escreve.
Por exemplo, eu poderia escrever imperativamente:
for each (Person person in people)
print(person.name)
que é totalmente legível como o inglês.
Uma versão Haskell pode ser (e isso não é válido, mas é apenas para comparação sintática):
map (print . name) people
que requer menos código e menos detalhes - não preciso dividir as coisas em um loop e suas variáveis ( for each (...)
), a map
função cuida disso para mim.
Trabalhar nesse nível pode levar algum tempo para se acostumar. Se isso ajuda, Haskell foi provavelmente o período mais difícil em que aprendi um novo idioma desde que comecei a programar e conheço mais de 10 idiomas (incluindo Lisp). Valeu a pena aprender totalmente.