Какие плюсы и минусы в изучении функционального программирования перед другими парадигмами?
Какие плюсы и минусы в изучении функционального программирования перед другими парадигмами?
Одна из основных проблем заключается в том, что если вы начнете с языка, подобного Haskell, все остальное будет казаться некачественным.
Честно говоря, я думаю, что начинать с такого языка, как Хаскелл или схема, было бы отличной идеей.
(Я признаю, что я наркоман функционального языка) РЕДАКТИРОВАТЬ:
Хорошо, что мне нравится в обоих языках:
Схема берет очень простой язык и строит из него удивительно надежный язык для разработки. Также SICP написан о схеме, которая делает его полезным для изучения прямо здесь. Схема - это самое простое, что вы можете себе представить, это полный язык.
Haskell Что действительно растет на мне, так это система типов. Многие ошибки, которые я вижу на других языках, связаны с тем, что где-то появляется неправильный тип. В Хаскеле это практически невозможно. Кроме того, идея ленивого языка просто порождает некоторые интересные вещи. Например, вы можете создавать бесконечные структуры данных в Haskell, а затем создавать только ту часть, которая вам нужна.
Самый большой плюс изучения функционального языка перед изучением языка ООП заключается в том, что ваши навыки программирования сначала развиваются, а затем вы можете легко понять концепции ООП. Если вы начнете с языка ООП, вам придется учить две вещи одновременно: «думать о коде» и «думать о ООД». Это может отвлечь. Сначала попрактикуйтесь с функциональным языком и развивайте свои навыки программирования. Затем изучите ООП и другие парадигмы. Так как ООП был призван восполнить недостатки структурного программирования, будет легче понять, почему. Вот почему курсы CS начинаются с C, а затем переходят к C ++.
источник
На вопрос, как научиться программированию, начиная с функционального программирования, две классические рекомендации:
Первый и очевидный классик структура и интерпретация компьютерных программ Абельсона и Суссмана, которая остается одним из лучших введений в CS и преподается с функциональной точки зрения с использованием Scheme. Это доступно полностью онлайн . Если вы не начинаете здесь, вы должны прийти сюда как-нибудь.
Более свежий текст, охватывающий большую часть той же темы в более мягком темпе и с большим акцентом на разработку программного обеспечения, - « Как разрабатывать программы » Мэтью Феллайзена и нескольких других из команды Racket / PLT, которая использует диалект Racket: Схема. Это также доступен онлайн , как и второе издание . Преимущество этой книги в том, что она предназначена для использования со средой программирования DrRacket, которая предоставляет очень удобный интерфейс для начинающих и экспертов, чтобы экспериментировать с кодом.
На вопрос о том, почему начать с функционального программирования, я хотел бы указать на блог Боба Харпера . Карнеги-Меллон недавно перестроил учебный план по CS для обучения функциональному программированию, а Харпер подробно освещал их успехи в своем блоге. Как один из тех, кто стоит за определением Standard ML, очевидно, что он за этот ход, и он хорошо объясняет причины этого.
Наконец, я бы предостерег в первую очередь от изучения Хаскелла, хотя другие могут не согласиться. Хотя чистый подход Haskell к FP, безусловно, породит хорошие привычки, фокусирование языка на ленивых вычислениях не обязательно подходит для новичка; Одна из первых и наиболее важных вещей, которые вам нужно научиться программисту, - это рассуждать о том, что именно делает ваша программа, глядя на источник, и об относительной стоимости различных подходов к одной и той же проблеме. По моему опыту, лень Хаскелла делает обе эти задачи чем-то вроде проблемы даже для опытных программистов, хотя Ваш пробег может меняться.
источник
Основным преимуществом (или недостатком) запуска с FP является то, что большинство концепций могут также применяться к императивному программированию. Царство Ракетки использует аналогии с видеоиграми для обучения как функциональным, так и императивным концепциям, и у выделенных учеников остается не только функциональная игра (npi), но и четкое понимание условий, рекурсии, циклов, ADT и дизайна, управляемого событиями. Эти понятия практически повсеместны в современном программировании и используются постоянно.
Тем не менее, еще важнее научиться кодировать абстракции , которые превосходят FP, с использованием функций и типов данных более высокого порядка. Как разрабатывать программы разрабатывать использует уникальный подход к этому, преподавая через индукцию. Например, студенты узнают, как
fold
работает, взглянув на код для получения как суммы, так и продукта списка, нахождения того, что у них общего, и выработки реализации самостоятельно.ООП-эквивалент вышеупомянутого может включать в себя одно или несколько из следующих: интерфейсы, абстрактные классы, обобщения, функторы или (если вы делаете это неправильно) синглтоны. Хотя это совершенно приемлемые шаблоны проектирования в Java, ИМХО они не входят во вводную учебную программу и служат только для того, чтобы запутать основные принципы. Даже будучи тем, кто был знаком с языками FP «поздно», я могу сказать, что навигация в постоянно меняющемся море ООП значительно упростилась благодаря наличию сильной функциональной привязки.
источник
RACKETEERS
. Не уверен, когда он истекает, извините.Функциональное программирование делает вещи намного проще. В языках ООП вам приходится иметь дело с управлением состоянием в нескольких потоках, не разрушая это состояние. В функциональных языках, когда большая часть выполняемой работы выполняется чистыми функциями, вам не нужно об этом беспокоиться.
С точки зрения скорости / производительности, я не настоящий жокей производительности, но быть функциональным не значит быть медленным, а структура функциональных языков имеет мало общего с их скоростью. Синтаксис функциональных языков сильно различается, например, различия между Clojure и Haskell. Clojure очень быстр, как есть, и может достигать (а иногда и превосходить) скорости Java с последующей оптимизацией.
Так что все действительно зависит от того, что вы ищете
источник
Я думаю, что доступность учебного материала, хороших примеров кода и наставников очень важна при изучении языков программирования. В зависимости от вашей ситуации у вас может быть наставник, который может вас научить и т. Д., Но я думаю, что функциональных языковых ресурсов очень мало по сравнению с основными языками. Это означает, что вы будете прогрессировать медленнее по сравнению с изучением основных языков. Но если вы не спешите, то это не проблема.
источник
Возможно, наиболее важной причиной для изучения изучения функциональных языков программирования является понимание алгебраических типов данных. Ментальное отображение поможет в моделировании отношений класса ОО и даже дизайна базы данных.
Акцент на многоядерные / многопроцессорные системы подчеркивает использование параллельных алгоритмов, которые можно выразить более четко и кратко в FP. Лямбда-ветвь языков, вероятно, увидит сильное увеличение использования в ближайшие один-два десятилетия.
Но есть и некоторые распространенные подводные камни. Полагать, что FP проще, - большая ошибка, поскольку вычисление пространственно-временной сложности, а также предоставление доказательств остановки могут быть гораздо более сложными в лямбда-исчислении, особенно в языках, которые поддерживают ленивую оценку.
Итак, выучите оба! Или, может быть, лучше: сначала изучите язык, который охватывает оба, такие как Scala. Если вы не возражаете против футболок с завязками и небольшого голландского акцента, возможно, вам пригодятся лекции доктора Эрика Мейера по FP , которые есть на MSDN.
источник