Схема против Haskell для введения в функциональное программирование?


36

Я знаком с программированием на C и C # и буду изучать C ++ в будущем. Меня может заинтересовать изучение функционального программирования как другой парадигмы программирования. Я делаю это для удовольствия, моя работа не связана с компьютерным программированием, и меня несколько вдохновляет использование функционального программирования, преподававшегося довольно рано на курсах информатики в колледже. Лямбда-исчисление, конечно, выходит за рамки моих математических способностей, но я думаю, что справлюсь с функциональным программированием.

Какой из Haskell или Scheme послужит хорошим введением в функциональное программирование? Я использую emacs в качестве своего текстового редактора и хотел бы, чтобы в будущем его можно было легко настроить, что повлечет за собой изучение Emacs Lisp. Однако я понимаю, что Emacs Lisp довольно сильно отличается от Scheme, а также является более процедурным, чем функциональным.

Скорее всего, я бы использовал книгу «Маленький мошенник», которую я уже купил, если буду следовать Схеме (мне кажется немного странным из-за моего ограниченного перелистывания). Или воспользуюсь «Изучу тебя на Haskell для большого блага», если я буду преследовать Haskell. Я также смотрю видео «Введение в Хаскелл» доктора Эрика Мейера на 9 канале.

Любые предложения, отзывы или отзывы приветствуются.

Спасибо.

PS Кстати, у меня также есть доступ к F #, поскольку у меня есть Visual Studio 2010, которую я использую для разработки на C #, но я не думаю, что это должно быть моим основным критерием при выборе языка.


3
Не забудьтеReal World Haskell
альтернатива

15
Незначительный побочный комментарий: лямбда-исчисление - чрезвычайно простая система; классная вещь в этом не то, что это сложно, а наоборот; что вы можете выразить все, что вы хотите в такой простой системе. Начать с языка программирования; теперь выбросить ВСЕ, кроме ссылок на переменные, определения функций и вызовов функций. Вуаля! Лямбда-исчисление.


9
Я могу научить вас лямбда-исчисление за пять минут. Теперь, понимание последствий того, что вы только что узнали, занимает целую жизнь. :)

5
Я выбрал Haskell вместо Scheme главным образом потому, что в нем не так много проклятых скобок!
Джои Адамс

Ответы:


27

Я бы порекомендовал 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, но не более») является непременным условием для того, чтобы быть функциональным языком. Я согласен не согласиться.


3
Спасибо, что подтолкнули меня к OCaml, и да, я рискну своей душой и исследую F #. Я занимаюсь разработкой для Linux, Mac OS X и Windows (в основном, первой), но FSI, кажется, доступен для всех трех платформ (моно в Linux и Mac OS X), что я уже делаю. Тот факт, что весь вес Microsoft лежит в основе функционального языка программирования (хотя и «нечистого»), следует приветствовать, а не осуждать поклонников функционального программирования.
хазиз

SML мертв, ocaml существует, чтобы написать coq
permeakra

1
+1 за ОД; это более понятно, чем Haskell.
m3th0dman

Я также считаю хорошей идеей изучать SML или OCaml, а затем Haskell (+1). Зная эти языки, выбрать другой (например, Scala) очень легко. Кроме того, можно взглянуть на Scheme, Common Lisp и Clojure (в этом порядке), чтобы почувствовать динамические языки.
Джорджио

@haziz: даже когда они создают хорошее программное обеспечение, Microsoft (или, в этом отношении, Oracle и т. д.) остается монополистом со всеми вытекающими из этого плохими методами, такими как блокировка клиентов, несовместимые форматы, несовместимые реализации и т. д.
Джорджио

26

Если вам интересны более продвинутые концепции в функциональном программировании, тогда переходите на Haskell. Есть правильная система типов и строгий запрет на мутации. Тем не менее, Haskell не для слабонервных.

Если вы просто хотите познакомиться с функциональным дизайном, воспользуйтесь Схемой. Синтаксис намного проще для изучения и чтения. Это позволяет процедурное программирование, но просто дисциплинируйте себя, чтобы не использовать какую-либо процедуру с символом !в конце имени.

С помощью Scheme вы также можете прочитать « Структура и интерпретация компьютерных программ» , которая является лучшим введением в парадигмы программирования. В книге есть лекции как из Массачусетского технологического института, так и из Беркли .


4
«Синтаксис намного легче выучить и прочесть» очень субъективен.

6
@luqui: правда. Возможно, «обычный» - это лучшее слово. Никаких кавычек, инфиксов, приоритетов или проблем ассоциативности - только круглые скобки, множество адских глупых скобок.
Хоа Лонг Там

17

Правильный ответ, конечно, оба! Так что это просто вопрос о том, какой язык следует решать в первую очередь. Моя ситуация идентична вашей. Мне действительно очень понравился Маленький Схемер. Вы обязательно поймете основные конструкции функционального программирования после того, как пройдете через это (и у вас будет место, где можно нанести пятна от желе!)

У меня около четверти в «Learn You a Haskell for Great». Я тоже наслаждаюсь этим, но две книги не могут быть более разными. Learn You a Haskell имеет очень традиционный подход к обучению конкретному языку. Маленький Схемер специфичен для Схемы, очевидно, но гораздо больше занимается обучением основам функционального программирования, а не языку Схемы.

Я определенно рекомендую начать с The Little Schemer. Это менее практично, но более фундаментально.


17

Мои два цента в отношении функционального программирования - не зацикливаться на конкретном языке, а изучать ключевые концепции функционального программирования. Я изучил функциональное программирование, бросив голову в проект, в котором мой начальник настоял, чтобы все разработки были выполнены в 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).


6

Я согласен с пунктом «выучить оба», но есть еще несколько моментов, которые не были упомянуты до сих пор. Прежде всего, если вы новичок в функциональном программировании и используете Haskell, вам нужно столкнуться с несколькими новыми вещами, помимо FP: вам нужно научиться жить в ленивой среде, которая может потребовать значительных усилий, и вам нужно иметь дело с «реальной» системой типов, которая может быть очень далека от того, что вы используете в C или C #.

Схема, OTOH, имеет внешний вид синтаксиса, но нет статической системы типов для изучения, и это строгий язык, поэтому вещи более знакомы. Кроме того, реализации Scheme имеют тенденцию быть очень гибкими - например, Racket доводит это до крайности и предоставляет ленивый и статически типизированный вариант. Это означает, что вы можете начать с «простых» вещей и освоить использование функционального языка, а позже вы можете вырастить себя и использовать типизированный и ленивый варианты. Теперь они должны быть проще, так как вам приходится иметь дело с одной функцией за раз. Чтобы быть понятным, концепциибудут достаточно новыми, чтобы синтаксическая проблема была незначительной и в основном неактуальной. Другими словами, как только вы начнете знакомиться с новыми концепциями, вы будете достаточно заняты, чтобы синтаксис просто исчез. (И если вы действительно заботитесь о синтаксисе, то синтаксис на Haskell я лично считаю очень элегантным, но это потому, что он также очень далек от вашего среднего синтаксиса C / C # / C ++.)

Но, сказав все это, я думаю, что есть и хороший момент для F # - вы говорите, что вы делаете это как побочную вещь, но когда вы изучите FP, вы скоро захотите использовать все эти хорошие вещи. Использование F # означает, что вы можете делать больше «реальных» вещей, поскольку, вероятно, легко решать те же проблемы, с которыми вы сталкиваетесь в своей повседневной работе. В идеале вы достигнете точки, в которой вы увидите преимущество использования этого, скажем, C # - и будете использовать его в каком-то проекте. Так что, хотя вы не правы в выборе F # только потому, что вам легче получить к нему доступ, вы должны учитывать это, поскольку нет ничего лучше, чем использоватьэти новые концепции. Напротив, если вы используете Scheme или Haskell и считаете его игрушечным языком для ваших целей (даже если вы знаете, что некоторые люди используют его для реальных приложений), то вы никогда не будете относиться ко всей вещи FP слишком серьезно. [Но YMMV, это в основном основано на субъективных наблюдениях и может сильно отличаться от одного человека к другому.]


6

Есть ли причина, по которой ML не подходит? Существует достаточное количество вводных материалов, включая книги и материалы курсов. Если вам нравится The Little Schemer, вам также может понравиться The Little MLer. Наконец, вы можете легко сделать переход к F # позже. (Не то чтобы я сбиваю Хаскель или Схему - в идеале выучить все три).

Также, предупреждение о Emacs Lisp. Я не думаю, что Haskell или ML подготовят вас к этому. Язык Lispy, такой как Scheme, поможет, но есть все еще серьезные различия, например. динамически изменяемые переменные. Расширения Emacs, по своей природе, имеют тенденцию быть более императивными, чем функциональными - они все об изменении состояния редактора.


Спасибо, что подтолкнули меня к ML / OCaml, и да, я "рискну своей душой" и исследую F #. Я занимаюсь разработкой для Linux, Mac OS X и Windows (в основном, первой), но FSI, кажется, доступен для всех трех платформ (моно в Linux и Mac OS X), что я уже делаю. Тот факт, что весь вес Microsoft лежит в основе функционального языка программирования (хотя и «нечистого»), следует приветствовать, а не осуждать поклонников функционального программирования.
Хазиз

Кстати, я заказал The Little MLer из Amazon и уже получил его и начал свое путешествие. Я также только что добавил Learning F # в свою библиотеку. Кажется, это более распространенное учебное пособие, которое я буду использовать для дополнения The Little MLer.
Хазиз

6

Напишите себе схему за 48 часов (в хаскеле)

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


На самом деле я использовал этот wiki / pdf, чтобы выучить Haskell и освежить свои навыки в OCaml (переводя идиоматический Haskell в OCaml). Было бы здорово, если бы кто-то мог взять этот материал и «раскошелиться» на несколько функциональных языков. Может быть основой для довольно крутой функциональной языковой перестрелки!
Marc

1
Основная проблема в том, что он вводит парсек без введения монад.
альтернатива

@alternative parsec имеет интерфейс Monadic, но также имеет интерфейс Applicative, не говоря уже о многих других функциях. Не так уж и неразумно вводить Parsec перед монадическим обобщением
Филипп JF

4

Я бы пошел с Хаскеллом. В схеме вы можете быть вынуждены делать процедурные вещи, и система типов не так полезна, как Haskell, что отлично подходит для новичка, поскольку в значительной степени проверяет, что ваш код корректен во время компиляции.


3
«в значительной степени проверяет, что ваш код правильный», очень неправильно. Ни одна система типов не может этого сделать. (Если ваша система типов не является настоящим доказателем теорем.)
Эли Барзилай

4
@Eli, ты использовал Haskell? Хотя теоретически это утверждение явно неверно, на практике я считаю его довольно точным, по крайней мере, по сравнению с любым другим языком, который я использовал. Тем не менее, я на самом деле не согласен, что это хорошая собственность для начинающих. Когда я изучаю веревки, я бы предпочел увидеть, что мой код сделал неправильно, вместо того, чтобы компилятор кричал мне, что это неправильно, и мне приходилось бороться с этим, когда я даже не знаю словарь, используемый сообщениями об ошибках.

1
@ Или "в значительной степени" является ключевым термином здесь. В Haskell вы тратите больше времени на размышления о том, как его реализовать, тогда реализация будет довольно легкой. Затем вы проверяете его, чтобы убедиться, что ваши карты, сгибы и т. Д. Являются нормальными.
альтернатива

@Eli Barzilay: система типов Haskell, похоже, очень близка к тому, чтобы доказывать теоремы. Это, безусловно, создало среду, в которой доказатели теорем почти кажутся более распространенными, чем другие инструменты. (Не то, чтобы я имел в виду причинно-следственную связь.)
Greyfade

@luqui - Да, я использовал это; нет, это все еще ложное утверждение, как на практике, так и в теории. Это не что-то уникальное для Хаскелла.
Эли Барзилай

1

Я думаю, что легко быть вовлеченным в дебаты о языках, и упустить момент. Для тех, кто просто хочет узнать, что такое FP, различия между Ocaml / ML / Scheme / Haskell не так важны, как ваш комфорт с материалом (книгами, видео, инструментами), который вы используете для его изучения. И есть ли у вас друг, который поможет вам научиться тому, что определенный язык превосходит все остальное.


0

Если это не чисто, вы можете использовать императивный язык, так что Haskell.


0

В одном из ответов, которые вы получили на свой вопрос, я нашел эту ссылку довольно интересной, потому что она дает вам представление о Хаскеле и Схеме.

В дополнение к этой изящной ссылке, вот мой взгляд на ваш вопрос.

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

Есть много хороших языков там. Люди Скала восхваляли свой язык, как и люди Clojure и CL. Даже питонисты утверждают, что лень. Другие люди, которые ответили вам, предложили ML. Amit Rathore, который написал Clojure in Action, может даже предложить вам изучить Haskell.

Вы упомянули Windows и F #. Поможет ли это вам в вашей нынешней должности? Я ничего не знаю о F #. Это достаточно функционально? Я спрашиваю об этом, потому что IMHO Python имеет функциональные конструкции, но это не похоже на программирование в Clojure.

Подводя итог, выучите функциональный язык, который является «действительно» функциональным и при этом лучше всего подходит для вашей ситуации.


-2

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.