Чтобы охватить функциональное программирование, вы должны перестать воспринимать переменные как области памяти, значения которых можно менять снова и снова. Вместо этого думайте о своих данных как о неизменном кусочке, который передается в функцию, создавая еще один неизменный кусочек данных. Если вы использовали конвейеры UNIX (или DOS) , они работают именно так. Цель состоит в том, чтобы связать воедино последовательность функций, которые преобразуют предоставленный ввод в желаемый вывод.
Чтобы попрактиковаться в этом, я предлагаю решить Project Euler на выбранном вами функциональном языке. Если вы еще не выбрали язык, Haskell предлагает меньше нефункциональных отвлекающих факторов, чем большинство языков. Тем не менее, обратитесь к другому вопросу SO , чтобы узнать больше.
После создания нескольких функциональных конвейеров вы быстро обнаружите, что хотите объединить функции более сложными способами, чем простое построение цепочки. Именно здесь в игру вступают функции более высокого уровня, включающие такие понятия, как отображение , свертывание и карри . Поиграв с этими концепциями, вы можете начать представлять себе абстракции более высокого уровня, которые называются такими именами, как монада и поднятие .
Ключ к этому прогрессу - убедиться, что вы ограничиваете себя функциональным стилем при решении своих практических задач. Один из способов сделать это - заставить себя выражать решения, используя только молчаливый (или бессмысленный ) форма.