Функциональный как первый язык

Ответы:

16

Одна из основных проблем заключается в том, что если вы начнете с языка, подобного Haskell, все остальное будет казаться некачественным.

Честно говоря, я думаю, что начинать с такого языка, как Хаскелл или схема, было бы отличной идеей.

(Я признаю, что я наркоман функционального языка) РЕДАКТИРОВАТЬ:

Хорошо, что мне нравится в обоих языках:

Схема берет очень простой язык и строит из него удивительно надежный язык для разработки. Также SICP написан о схеме, которая делает его полезным для изучения прямо здесь. Схема - это самое простое, что вы можете себе представить, это полный язык.

Haskell Что действительно растет на мне, так это система типов. Многие ошибки, которые я вижу на других языках, связаны с тем, что где-то появляется неправильный тип. В Хаскеле это практически невозможно. Кроме того, идея ленивого языка просто порождает некоторые интересные вещи. Например, вы можете создавать бесконечные структуры данных в Haskell, а затем создавать только ту часть, которая вам нужна.

Захари К
источник
Честно говоря, целая куча языков включает в себя все больше и больше функциональных аспектов, поэтому жизнь не так плоха, как раньше.
Тихон Джелвис
Правда, и для тех, кто любит FP, это не что иное, как хорошая вещь
Захария К
3
Я знаю - я предлагаю это как хорошую причину для изучения FP в первую очередь. Это тенденция, которая делает меня действительно счастливым некоторое время.
Тихон Джелвис
Правда, мало что говорит, чтобы ответить на вопрос - почему тебе нравится Хаскелл (или Схема)? Будут ли они хороши в качестве первых языков для изучения? Почему?
Jimwise
Добавлены некоторые комментарии об обоих языках
Захари К
6

Самый большой плюс изучения функционального языка перед изучением языка ООП заключается в том, что ваши навыки программирования сначала развиваются, а затем вы можете легко понять концепции ООП. Если вы начнете с языка ООП, вам придется учить две вещи одновременно: «думать о коде» и «думать о ООД». Это может отвлечь. Сначала попрактикуйтесь с функциональным языком и развивайте свои навыки программирования. Затем изучите ООП и другие парадигмы. Так как ООП был призван восполнить недостатки структурного программирования, будет легче понять, почему. Вот почему курсы CS начинаются с C, а затем переходят к C ++.

DPD
источник
1
В моем университете мы сначала начали с функционального языка Standard ML и узнали, что такое побочные эффекты. После этого мы узнали C, но мы никогда не изучали C ++.
Джонас
@Jonas. Я предполагаю, что разные страны / университеты имеют очень разную структуру курса. В моем университете C, за которым следует C ++, является стандартом для курсов Comuter Science Engg, но для других инженерных потоков преподается только C.
DPD
В моем университете мы начинаем с Java, а затем просто используем язык, подходящий для курсов. Например, C / C ++ используется для системного программирования, C # для пользовательского интерфейса, различные языки ассемблера для организации компьютеров, и я думаю, что вы хотите для программирования игр
Карсон Майерс
В моем университете мы начали с изучения схемы (с SICP). Первые несколько недель были полностью функциональными; ООП был хорошо введен в курс. Я думал, что все это выложено очень хорошо и довольно понравился курс.
Тихон Джелвис
6

На вопрос, как научиться программированию, начиная с функционального программирования, две классические рекомендации:

  • Первый и очевидный классик структура и интерпретация компьютерных программ Абельсона и Суссмана, которая остается одним из лучших введений в CS и преподается с функциональной точки зрения с использованием Scheme. Это доступно полностью онлайн . Если вы не начинаете здесь, вы должны прийти сюда как-нибудь.

  • Более свежий текст, охватывающий большую часть той же темы в более мягком темпе и с большим акцентом на разработку программного обеспечения, - « Как разрабатывать программы » Мэтью Феллайзена и нескольких других из команды Racket / PLT, которая использует диалект Racket: Схема. Это также доступен онлайн , как и второе издание . Преимущество этой книги в том, что она предназначена для использования со средой программирования DrRacket, которая предоставляет очень удобный интерфейс для начинающих и экспертов, чтобы экспериментировать с кодом.

На вопрос о том, почему начать с функционального программирования, я хотел бы указать на блог Боба Харпера . Карнеги-Меллон недавно перестроил учебный план по CS для обучения функциональному программированию, а Харпер подробно освещал их успехи в своем блоге. Как один из тех, кто стоит за определением Standard ML, очевидно, что он за этот ход, и он хорошо объясняет причины этого.

Наконец, я бы предостерег в первую очередь от изучения Хаскелла, хотя другие могут не согласиться. Хотя чистый подход Haskell к FP, безусловно, породит хорошие привычки, фокусирование языка на ленивых вычислениях не обязательно подходит для новичка; Одна из первых и наиболее важных вещей, которые вам нужно научиться программисту, - это рассуждать о том, что именно делает ваша программа, глядя на источник, и об относительной стоимости различных подходов к одной и той же проблеме. По моему опыту, лень Хаскелла делает обе эти задачи чем-то вроде проблемы даже для опытных программистов, хотя Ваш пробег может меняться.

jimwise
источник
5

Основным преимуществом (или недостатком) запуска с FP является то, что большинство концепций могут также применяться к императивному программированию. Царство Ракетки использует аналогии с видеоиграми для обучения как функциональным, так и императивным концепциям, и у выделенных учеников остается не только функциональная игра (npi), но и четкое понимание условий, рекурсии, циклов, ADT и дизайна, управляемого событиями. Эти понятия практически повсеместны в современном программировании и используются постоянно.

Тем не менее, еще важнее научиться кодировать абстракции , которые превосходят FP, с использованием функций и типов данных более высокого порядка. Как разрабатывать программы разрабатывать использует уникальный подход к этому, преподавая через индукцию. Например, студенты узнают, как foldработает, взглянув на код для получения как суммы, так и продукта списка, нахождения того, что у них общего, и выработки реализации самостоятельно.

ООП-эквивалент вышеупомянутого может включать в себя одно или несколько из следующих: интерфейсы, абстрактные классы, обобщения, функторы или (если вы делаете это неправильно) синглтоны. Хотя это совершенно приемлемые шаблоны проектирования в Java, ИМХО они не входят во вводную учебную программу и служат только для того, чтобы запутать основные принципы. Даже будучи тем, кто был знаком с языками FP «поздно», я могу сказать, что навигация в постоянно меняющемся море ООП значительно упростилась благодаря наличию сильной функциональной привязки.

ошибка
источник
Чуть не забыл: если вы хотите купить Сферу Ракетка, попробуйте этот купон: RACKETEERS. Не уверен, когда он истекает, извините.
ошибка
+1 за упоминание функций высшего порядка - я был готов опубликовать свой собственный ответ о них. Половина моих коллег борется с этой концепцией, а остальные, которые ее получают, не думают о них, когда это будет самое простое решение.
Изката
1
Я не слышал о Realm of Racket, но по названию сразу понял, что это было, потому что название относится к его старшему брату, Лиспской земле.
Волхв
4

Функциональное программирование делает вещи намного проще. В языках ООП вам приходится иметь дело с управлением состоянием в нескольких потоках, не разрушая это состояние. В функциональных языках, когда большая часть выполняемой работы выполняется чистыми функциями, вам не нужно об этом беспокоиться.

С точки зрения скорости / производительности, я не настоящий жокей производительности, но быть функциональным не значит быть медленным, а структура функциональных языков имеет мало общего с их скоростью. Синтаксис функциональных языков сильно различается, например, различия между Clojure и Haskell. Clojure очень быстр, как есть, и может достигать (а иногда и превосходить) скорости Java с последующей оптимизацией.

Так что все действительно зависит от того, что вы ищете

MattyD
источник
2

Я думаю, что доступность учебного материала, хороших примеров кода и наставников очень важна при изучении языков программирования. В зависимости от вашей ситуации у вас может быть наставник, который может вас научить и т. Д., Но я думаю, что функциональных языковых ресурсов очень мало по сравнению с основными языками. Это означает, что вы будете прогрессировать медленнее по сравнению с изучением основных языков. Но если вы не спешите, то это не проблема.

Энди Тяхджоно
источник
1
Я думаю, что ваши предположения неверны. Там являются хорошие учебники, книги, статьи и т.д. о функциональном материале. Более того, есть много статей, посвященных специальным вещам, таким как система типов, реализация, виртуальные машины, лямбда-исчисление и так далее.
Инго
1

Возможно, наиболее важной причиной для изучения изучения функциональных языков программирования является понимание алгебраических типов данных. Ментальное отображение поможет в моделировании отношений класса ОО и даже дизайна базы данных.

Акцент на многоядерные / многопроцессорные системы подчеркивает использование параллельных алгоритмов, которые можно выразить более четко и кратко в FP. Лямбда-ветвь языков, вероятно, увидит сильное увеличение использования в ближайшие один-два десятилетия.

Но есть и некоторые распространенные подводные камни. Полагать, что FP проще, - большая ошибка, поскольку вычисление пространственно-временной сложности, а также предоставление доказательств остановки могут быть гораздо более сложными в лямбда-исчислении, особенно в языках, которые поддерживают ленивую оценку.

Итак, выучите оба! Или, может быть, лучше: сначала изучите язык, который охватывает оба, такие как Scala. Если вы не возражаете против футболок с завязками и небольшого голландского акцента, возможно, вам пригодятся лекции доктора Эрика Мейера по FP , которые есть на MSDN.

Dibbeke
источник