Learning Curves for different programming languages (including Haskell)

I think imperative is very natural for humans. We evolved doing operations in order. Kill something, skin it, eat it, sleep, make some babies, try not to die, repeat. We're practically born crawling from one place to another; goto was so obvious. OO makes a ton of sense to us, too. I remember the first paragraph I read in a book on OO, thinking "This is great! What a smart idea." Of course a dog is an animal. Of course a tree has leaves. It felt like I already knew everything, because it immediately seemed to model my view of the world around me. Even the confusing bits were wrapped in cloaks of familiarity, comforting me, and urging me forward (into horrors untold).

I would argue that the earliest bits of FP are not very natural to humans. Algebraic data types had me squinting and scratching my head when I first saw them. It took a few days before I started to believe I knew what they were. I needed a bunch of descriptions, corrections to my assertions, and time to let it all settle. I'd never seen anything like this before. It looked so simple, but I just couldn't fit it into my understanding of making a computer do things. I couldn't match it to anything I knew. I was stranded.

Imperative words were easy - if some condition, do some thing, else do some other thing - that's straight up English. For loops didn't take much work to get - do this thing to/for/with every item in this collection of items. Slightly harder - especially syntactically - but not bad. While loops were also obvious. OO words - many of them - are fairly obvious - implements, interface, hierarchies, is a(n)/has a(n), instance, etc. They're fairly attainable to the novice.

FP words are anything but easy - functor, applicative, monad, algebraic data type, product/sum types, higher kinded types, categories (which aren't what people think of as categories), return (which doesn't return anything), co/bi/endo/homo versions of everything... Mom never told me to map setting a place for a person at the table for every person in the list of people who will be eating dinner tonight. Every single step starts with complete confusion, and a climbing out of the confusion into a new world where I know things that feel very new and unrelated to a lifetime of experience.

/r/haskell Thread Link - github.com