ок, putStrLn возвращает функцию которая вызывает функцию которая печатает текст) но сути не изменяет, просто еще одна функция добавляется)
Ну это, собственно, всё и меняет.
В хаскеле ты никогда не опепируешь напрямую с действимяи с внешним миром и побочными эффектами, ты абсолютно чистым образом собираешь из кусков программу на eDSL (наше IO), которая когда-то потом и непойми кем будет выполнена.