I think one thing you're probably running into is something that I ran into too when learning functional programming, which is that with functional programming you can (and almost have to) think/work at a higher level than you do with imperative programming.
What you're finding as less expressive, I think is actually more expressive: you don't have to spell out every little detail and can do more with less code in functional programming -- there's more power to what you write.
For example, I could write imperatively:
for each (Person person in people)
print(person.name)
which is totally legible as English.
A Haskell version might be (and this is not valid Haskell, but is just for syntactic comparison):
map (print . name) people
which requires less code and less detail wrangling -- I don't have to break things down into a loop and its variable(s) (for each (...)
), the map
function takes care of that for me.
Working at that level can take some getting used to. If it helps any, Haskell was probably the toughest time I've had learning a new language since I started programming, and I know >10 languages (including Lisp). It was totally worth learning though.