Ответы:
Одна из основных проблем заключается в том, что если вы начнете с языка, подобного 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.