Penso che una cosa che probabilmente stai incontrando è qualcosa che ho incontrato anche quando ho imparato la programmazione funzionale, ovvero che con la programmazione funzionale puoi (e quasi devi) pensare / lavorare a un livello più alto di quello che fai con programmazione imperativa.
Ciò che trovi meno espressivo, in realtà è più espressivo: non devi specificare ogni piccolo dettaglio e puoi fare di più con meno codice nella programmazione funzionale - c'è più potere a ciò che scrivi.
Ad esempio, potrei scrivere imperativamente:
for each (Person person in people)
print(person.name)
che è completamente leggibile come inglese.
Una versione Haskell potrebbe essere (e questo non è Haskell valido, ma è solo per il confronto sintattico):
map (print . name) people
che richiede meno codice e meno wrangling dei dettagli - Non devo rompere le cose in un ciclo e le sue variabili ( for each (...)
), la funzione map
si occupa di questo per me.
Lavorare a quel livello può richiedere un po 'di tempo per abituarsi. Se è d'aiuto, Haskell è stato probabilmente il periodo più difficile in cui ho imparato una nuova lingua da quando ho iniziato a programmare e conosco 10 lingue (incluso il Lisp). Però valeva assolutamente la pena imparare.