Я знаком с программированием на C и C # и буду изучать C ++ в будущем. Меня может заинтересовать изучение функционального программирования как другой парадигмы программирования. Я делаю это для удовольствия, моя работа не связана с компьютерным программированием, и меня несколько вдохновляет использование функционального программирования, преподававшегося довольно рано на курсах информатики в колледже. Лямбда-исчисление, конечно, выходит за рамки моих математических способностей, но я думаю, что справлюсь с функциональным программированием.
Какой из Haskell или Scheme послужит хорошим введением в функциональное программирование? Я использую emacs в качестве своего текстового редактора и хотел бы, чтобы в будущем его можно было легко настроить, что повлечет за собой изучение Emacs Lisp. Однако я понимаю, что Emacs Lisp довольно сильно отличается от Scheme, а также является более процедурным, чем функциональным.
Скорее всего, я бы использовал книгу «Маленький мошенник», которую я уже купил, если буду следовать Схеме (мне кажется немного странным из-за моего ограниченного перелистывания). Или воспользуюсь «Изучу тебя на Haskell для большого блага», если я буду преследовать Haskell. Я также смотрю видео «Введение в Хаскелл» доктора Эрика Мейера на 9 канале.
Любые предложения, отзывы или отзывы приветствуются.
Спасибо.
PS Кстати, у меня также есть доступ к F #, поскольку у меня есть Visual Studio 2010, которую я использую для разработки на C #, но я не думаю, что это должно быть моим основным критерием при выборе языка.
Real World Haskell
Ответы:
Я бы порекомендовал OCaml.
С моей личной точки зрения, основной основой современного функционального программирования являются функции высшего порядка, статическая система типов, алгебраические типы данных и сопоставление с образцом.
Между Схемой, ML и Haskell я бы выбрал ML, потому что я думаю, что он наиболее соответствует этому определению. Схема не имеет статической типизации (есть Typed Racket, но она не для начинающих), а у Haskell есть слишком много других вещей (монады, ленивая оценка ...), которые, хотя и интересны, могут отвлечь внимание от важной основы. ,
SML и OCaml одинаково интересны; Я больше привык к OCaml, и у него более «практичное» чувство, которое приятно (но если вы действительно хотите «практичным» с риском потерять свою душу, вы можете также выбрать F #).
Scheme и Haskell также очень интересные языки. Акцент схемы на макросах интересен, но не имеет прямого отношения к функциональному программированию (это еще одна вещь в мире, которую вы обязательно должны попробовать, а также логическое программирование, языки на основе стеков и ориентированные на возможности E).
Haskell, безусловно, отличный язык и, я думаю, обязательный пункт для начинающих гуру функционального программирования. Но поскольку основные языки OCaml и Haskell очень похожи (за исключением ленивых вычислений, которые отвлекают новичка), освоить Haskell легко, если вы знаете основы OCaml. Или, скорее, вы можете сосредоточиться на странных вещах, и вам не нужно одновременно усваивать основы.
Точно так же, как только вы увидели OCaml и, возможно, также Haskell, и все еще хотите узнать больше, вы должны взглянуть на Coq или Agda. Тем не менее, немногие рекомендуют Coq или Agda для первого знакомства с функциональным программированием ...
Чтобы прояснить мою мысль: я думаю, что изучение OCaml (или SML), а затем Haskell сделает вас таким же хорошим функциональным программистом, как и изучение Haskell напрямую, но легче (или менее болезненно).
Кроме того, у OCaml и Haskell есть отличия, и интересно узнать о расширенных возможностях обоих . Просто изучение Haskell хуже в этом аспекте (хотя, конечно, вы можете изучать OCaml после Haskell; я думаю, что это менее логично и разочарует вас).
Для изучения OCaml я бы порекомендовал черновик книги Джейсона Хикки (PDF) .
¹ это определение является спорным. Некоторые люди из Scheme утверждают, что статическая типизация не имеет ничего общего с функциональным программированием. Некоторые люди на Haskell утверждают, что их определение чистоты («что делает Haskell, но не более») является непременным условием для того, чтобы быть функциональным языком. Я согласен не согласиться.
источник
Если вам интересны более продвинутые концепции в функциональном программировании, тогда переходите на Haskell. Есть правильная система типов и строгий запрет на мутации. Тем не менее, Haskell не для слабонервных.
Если вы просто хотите познакомиться с функциональным дизайном, воспользуйтесь Схемой. Синтаксис намного проще для изучения и чтения. Это позволяет процедурное программирование, но просто дисциплинируйте себя, чтобы не использовать какую-либо процедуру с символом
!
в конце имени.С помощью Scheme вы также можете прочитать « Структура и интерпретация компьютерных программ» , которая является лучшим введением в парадигмы программирования. В книге есть лекции как из Массачусетского технологического института, так и из Беркли .
источник
Правильный ответ, конечно, оба! Так что это просто вопрос о том, какой язык следует решать в первую очередь. Моя ситуация идентична вашей. Мне действительно очень понравился Маленький Схемер. Вы обязательно поймете основные конструкции функционального программирования после того, как пройдете через это (и у вас будет место, где можно нанести пятна от желе!)
У меня около четверти в «Learn You a Haskell for Great». Я тоже наслаждаюсь этим, но две книги не могут быть более разными. Learn You a Haskell имеет очень традиционный подход к обучению конкретному языку. Маленький Схемер специфичен для Схемы, очевидно, но гораздо больше занимается обучением основам функционального программирования, а не языку Схемы.
Я определенно рекомендую начать с The Little Schemer. Это менее практично, но более фундаментально.
источник
Мои два цента в отношении функционального программирования - не зацикливаться на конкретном языке, а изучать ключевые концепции функционального программирования. Я изучил функциональное программирование, бросив голову в проект, в котором мой начальник настоял, чтобы все разработки были выполнены в APL. APL - это язык обработки функциональных массивов, и он настолько далеко от LISP, Haskell или любого другого основного языка программирования, сколько вы можете получить. Реальная отдача состояла в том, что когда я обнаружил, что как только я «ухватился» за функциональную парадигму программирования и мысленно научился автоматически разбивать проблему на функциональную программу, меня больше не пугали идиоматические аспекты других функциональных языков, таких как Haskell, OCaml, Scheme, Scala и Clojure. Я'
Если бы я выбрал первый функциональный язык, я бы, вероятно, выбрал Haskell или Steel Bank Common Lisp (SBCL). Что касается Haskell, я бы прочитал « Learn You a Haskell ...» , «Haskell в реальном мире» , «Путь к логике, математике и программированию на Haskell» и « Жемчужины разработки функциональных алгоритмов» . Для CL я бы прочитал Land of Lisp , « Парадигмы программирования искусственного интеллекта» и (если вы действительно хардкорный) Let over Lambda . Вы можете смешивать и сочетать все эти книги, чтобы получить широкий обзор практических подходов и концепций функционального программирования.
Я также хотел бы изучить Clojure и Scala, так как они оба являются очень хорошими и очень выразительными функциональными языками сами по себе (несмотря на то, что сказал бы пурист FP).
источник
Я согласен с пунктом «выучить оба», но есть еще несколько моментов, которые не были упомянуты до сих пор. Прежде всего, если вы новичок в функциональном программировании и используете Haskell, вам нужно столкнуться с несколькими новыми вещами, помимо FP: вам нужно научиться жить в ленивой среде, которая может потребовать значительных усилий, и вам нужно иметь дело с «реальной» системой типов, которая может быть очень далека от того, что вы используете в C или C #.
Схема, OTOH, имеет внешний вид синтаксиса, но нет статической системы типов для изучения, и это строгий язык, поэтому вещи более знакомы. Кроме того, реализации Scheme имеют тенденцию быть очень гибкими - например, Racket доводит это до крайности и предоставляет ленивый и статически типизированный вариант. Это означает, что вы можете начать с «простых» вещей и освоить использование функционального языка, а позже вы можете вырастить себя и использовать типизированный и ленивый варианты. Теперь они должны быть проще, так как вам приходится иметь дело с одной функцией за раз. Чтобы быть понятным, концепциибудут достаточно новыми, чтобы синтаксическая проблема была незначительной и в основном неактуальной. Другими словами, как только вы начнете знакомиться с новыми концепциями, вы будете достаточно заняты, чтобы синтаксис просто исчез. (И если вы действительно заботитесь о синтаксисе, то синтаксис на Haskell я лично считаю очень элегантным, но это потому, что он также очень далек от вашего среднего синтаксиса C / C # / C ++.)
Но, сказав все это, я думаю, что есть и хороший момент для F # - вы говорите, что вы делаете это как побочную вещь, но когда вы изучите FP, вы скоро захотите использовать все эти хорошие вещи. Использование F # означает, что вы можете делать больше «реальных» вещей, поскольку, вероятно, легко решать те же проблемы, с которыми вы сталкиваетесь в своей повседневной работе. В идеале вы достигнете точки, в которой вы увидите преимущество использования этого, скажем, C # - и будете использовать его в каком-то проекте. Так что, хотя вы не правы в выборе F # только потому, что вам легче получить к нему доступ, вы должны учитывать это, поскольку нет ничего лучше, чем использоватьэти новые концепции. Напротив, если вы используете Scheme или Haskell и считаете его игрушечным языком для ваших целей (даже если вы знаете, что некоторые люди используют его для реальных приложений), то вы никогда не будете относиться ко всей вещи FP слишком серьезно. [Но YMMV, это в основном основано на субъективных наблюдениях и может сильно отличаться от одного человека к другому.]
источник
Есть ли причина, по которой ML не подходит? Существует достаточное количество вводных материалов, включая книги и материалы курсов. Если вам нравится The Little Schemer, вам также может понравиться The Little MLer. Наконец, вы можете легко сделать переход к F # позже. (Не то чтобы я сбиваю Хаскель или Схему - в идеале выучить все три).
Также, предупреждение о Emacs Lisp. Я не думаю, что Haskell или ML подготовят вас к этому. Язык Lispy, такой как Scheme, поможет, но есть все еще серьезные различия, например. динамически изменяемые переменные. Расширения Emacs, по своей природе, имеют тенденцию быть более императивными, чем функциональными - они все об изменении состояния редактора.
источник
Напишите себе схему за 48 часов (в хаскеле)
Я действительно рекомендую это. Вы изучите Haskell, используя реальную и интересную задачу, и вы узнаете лучший урок схемы, играя с созданным вами переводчиком. Если вы идете этим путем, держите несколько хороших представлений о Хаскеле. Вы поймете их лучше, если у вас есть проблема, которую нужно решить.
источник
Я бы пошел с Хаскеллом. В схеме вы можете быть вынуждены делать процедурные вещи, и система типов не так полезна, как Haskell, что отлично подходит для новичка, поскольку в значительной степени проверяет, что ваш код корректен во время компиляции.
источник
Я думаю, что легко быть вовлеченным в дебаты о языках, и упустить момент. Для тех, кто просто хочет узнать, что такое FP, различия между Ocaml / ML / Scheme / Haskell не так важны, как ваш комфорт с материалом (книгами, видео, инструментами), который вы используете для его изучения. И есть ли у вас друг, который поможет вам научиться тому, что определенный язык превосходит все остальное.
источник
Если это не чисто, вы можете использовать императивный язык, так что Haskell.
источник
В одном из ответов, которые вы получили на свой вопрос, я нашел эту ссылку довольно интересной, потому что она дает вам представление о Хаскеле и Схеме.
В дополнение к этой изящной ссылке, вот мой взгляд на ваш вопрос.
Если вы начинаете с обязательного опыта программирования, вы можете приложить немало усилий для изучения функционального программирования. Я бы позаботился о том, чтобы опыт обучения не был пустым. Это означает, что вы можете применить его к своей текущей или следующей работе или помочь вам каким-либо другим способом.
Есть много хороших языков там. Люди Скала восхваляли свой язык, как и люди Clojure и CL. Даже питонисты утверждают, что лень. Другие люди, которые ответили вам, предложили ML. Amit Rathore, который написал Clojure in Action, может даже предложить вам изучить Haskell.
Вы упомянули Windows и F #. Поможет ли это вам в вашей нынешней должности? Я ничего не знаю о F #. Это достаточно функционально? Я спрашиваю об этом, потому что IMHO Python имеет функциональные конструкции, но это не похоже на программирование в Clojure.
Подводя итог, выучите функциональный язык, который является «действительно» функциональным и при этом лучше всего подходит для вашей ситуации.
источник
С точки зрения относительного новичка, я предлагаю не начинать с SICP, если вы выбираете Схему, если ваша математика не достаточно развита. Книга и видео полны тонкостей и совсем не интуитивны для кого-то начинающего.
источник