Какой самый простой функциональный язык программирования для тех, кто имеет опыт работы с императивными языками? [закрытый]

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

спасибо

6 ответов


рекомендую pure-lang для этих педагогических целей. Он также достаточно мощный. Если вы хотите что-то более популярное / с большей поддержкой сообщества, я бы рекомендовал Scheme или OCaml, в зависимости от того, предпочитаете ли вы иметь дело с незнакомым синтаксисом (go With Scheme) или иметь дело с незнакомым типом (go With OCaml). SML и F# лишь немного отличаются от OCaml. Другие упоминают или будут упоминать Clojure, Scala и Haskell.

Clojure является вариантом схемы, со своими собственными идиосинкразиями (например, без оптимизации хвостового вызова), поэтому использование его было бы способом начать со схемы. Я ожидал,что вам будет легче с менее идиосинкразической реализацией схемы. ракетка это то, что часто используется для обучения. Scala выглядит принципиально похожим на OCaml, но это основано только на случайном знакомстве.

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

Роберт Харпер в КМУ есть несколько хороших постов в блоге о преподавании функционального программирования. Насколько я понимаю, он также предпочитает для преподавания такие языки, как OCaml.

среди трех классов языков, которые я рекомендовал (Pure, Scheme и friends, OCaml и friends), первые два имеют динамическое типирование. Первая и третья имеют явные ссылочные ячейки (как будто в Python вы ограничили себя никогда reassiging переменной, но вы все еще можете изменить то, что хранится в индексе список). Схема имеет неявные ссылочные ячейки: сами переменные выглядят изменяемыми, как в C и Python, а обработка ссылочных ячеек выполняется под обложками. В таких языках у вас часто есть какая-то форма явной ссылочной ячейки (как в Примере, который я только что дал в Python, или с использованием изменяемых пар/списков в ракетке...в других схемах, включая стандарт схемы, это по умолчанию пары / списки).

одна добродетель Haskell действительно есть, некоторые учебники появляются для него. (Я говорю это искренне, а не ехидно.) Какие книги/ресурсы использовать еще один спорный вопрос со многими войнами/закрытые вопросы. SICP, как рекомендовали другие, имеет много поклонников, а также некоторых критиков. Мне кажется, есть много хороших вариантов. Я не буду углубляться в эти дебаты.


сначала прочитайте структуру и реализацию компьютерных программ. Я рекомендую Lisp (например, это диалектная схема) в качестве первого функционального языка программирования.


другой вариант-Clojure, который мне дали понять, является более "чисто" функциональным, чем Scheme/Racket (не спрашивайте меня о деталях здесь) и, возможно, достаточно похожим, чтобы позволить вам использовать его в сочетании с SICP (структура и интерпретация компьютерных программ, настоятельно рекомендуемая книга также предлагается другим ответом).


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

большой вопрос!

Я done BASIC, Pascal, assembler, C и c++, прежде чем я начал заниматься функциональным программированием в конце 1990-х годов. Затем я начал использовать два функциональных языка примерно в одно и то же время, Mathematica и OCaml, и использовал их исключительно в течение нескольких лет. В частности, OCaml позволил мне написать императивный код, который выглядел как код, который я писал раньше. Я нашел это ценным как ученик, потому что это позволило мне сравнить различные подходы, которые сделали преимущества ML очевидный.

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


этот вопрос, вероятно, не по теме, потому что это приведет к бесконечным языковым войнам, но вот общий совет:

существует класс функциональных языков программирования, которые иногда называют "в основном функциональными", поскольку они позволяют некоторые императивные функции там, где вы их хотите. Примеры включают стандартные ML, OCaml, F# и Scala. Вы можете рассмотреть один из них, если хотите иметь возможность получить контроль над функциональным идиоматическим стилем, все еще находясь способный достигать цели достаточно знакомыми способами.

Я широко использовал стандартный ML в прошлом, но если вы ищете что-то, что имеет немного меньшую кривую обучения, я бы лично рекомендовал Scala, который является моим вторым любимым языком программирования. Причины этого включают в себя Распространенность библиотек, сообщество здорового размера и наличие хороших книг и учебников, которые помогут вам начать работу (особенно если у вас когда-либо были какие-либо отношения с Ява.)


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