Какая теоретическая база нужна, чтобы заняться функциональным программированием на Haskell?
Для [Haskell] вроде как нужна большая теоретическая база Это не совсем так. Вот Вы когда сдачу в магазине пересчитываете, Вы вряд ли задумываетесь о том, что множества, используемые Вами для пересчёта мелочи (множество натуральных чисел, целых чисел и т. д.) с заданными на этих множествах операциями (сложение, умножение и т. д.) образуют различные алгебраические структуры (всякие там кольца, полугруппы, поля и прочее). Более того, даже если бы Вы об этом задумывались, это бы ну никак не помогало посчитать сдачу.
С теоретической безой Haskell'а почти также — Haskell активно использует понятия из теории категорий (категории, стрелки, монады, функторы и т. д.), но для использования этих понятий в рамках Haskell достаточно (по крайней мере на первых порах) рассматривать их просто как ФП-паттерны (по аналогии с ООП-паттернами, такими как фасад, синглтон, адаптер и вот это вот всё). Так, монада — просто тип, имеющий определённый набор "методов" (выражаясь в терминах ООП), удовлетворяющих определённым требованиям.
В общем, чтобы начать учить Haskell, ящитаю, особого теоретического бэкграунда не нужно. На первых шагах всё что Вам нужно будет понять — каррирование, ФВП, лямбды, ленивость. Это всё достаточно простые вещи, разжёванные в начале любой книжки по функциональному программированию. Ну а если вдруг, когда Вы столкнётесь с понятием "монада", Вам захочется узнать, что оно значит вне Haskell'а, откуда оно взялось — никто не мешает прочитать статейку/главу книги о ТК когда это понадобиться, не обязательно делать это заранее.
Ну и если ты привык думать циклами и итерациям, то придется научиться думать рекурсиями.