Какой язык выучить после Хаскелла? [закрытый]


Как мой первый язык программирования, я решил изучить Haskell. Я специализируюсь на аналитической философии, и Хаскелл позволил мне быстро и правильно создавать интересные программы, например, преобразователи для анализа естественного языка, доказатели теорем и интерпретаторы. Хотя я программирую только два с половиной месяца, я нашел семантику и синтаксис Хаскелла намного легче изучать, чем более традиционные императивные языки, и чувствую себя комфортно (сейчас) с большинством его строит.

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

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

взвешивание ответов: это просто заметки, конечно. Я просто хотел бы ответить всем, кто дал хорошо сформированные ответы. Вы были очень полезны.

1) несколько ответов показали, что сильный, статически типизированный язык, подчеркивающий рекурсию, означает другой функциональный язык. Хотя я хочу продолжать активно работать с Haskell, camccann и larsmans правильно указали выходит, что другой такой язык "слишком облегчит переход"."Эти комментарии были очень полезны, потому что я не собираюсь писать Haskell в Caml! Из помощников доказательства, Coq и Agda оба выглядят интересными. В частности, Coq обеспечит прочное введение в конструктивную логику и формальную теорию типов. Я провел немного времени с предикатом первого порядка и модальной логикой (Мендельсон, Эндертон, некоторые из Хинмана), поэтому мне, вероятно, будет очень весело с Coq.

2) Другие сильно предпочитали Lisp (Common Lisp, Scheme и Clojure). Из того, что я собираю, как Common Lisp, так и Scheme имеют отличный вводный материал (На Лиспе и Рассудительный Интриган,SICP). Материал в SICP заставляет меня склониться к схеме. В частности, схема через SICP будет охватывать другую стратегию оценки, реализацию лени и возможность сосредоточиться на таких темах, как продолжение, интерпретаторы, символические вычисления и так далее. Наконец, как указывали другие, обработка кода/данных Lisp будет совершенно новой. Следовательно, я сильно склоняюсь к варианту (2), шепелявит.

3) В-Третьих, Пролог. Пролог имеет огромное количество интересного материала, и его основной домен-это именно тот, который меня интересует. Он имеет простой синтаксис и легко читается. Я не могу комментировать больше на данный момент, но после прочтения обзора пролога и просмотра некоторых вводный материал, он занимает место с (2). И похоже, что отступление пролога всегда взломано в Haskell!

4) из основных языков, Python выглядит наиболее интересным. Тим Йейтс делает языки звучать очень привлекательно. По-видимому, Python часто преподается первокурсникам CS; поэтому он либо концептуально богат, либо прост в освоении. Мне нужно провести больше исследований.

спасибо всем за ваши рекомендации! Это выглядит как Lisp (схема, Clojure), Пролог или помощник доказательства, такой как Coq или Agda, являются основными языками, которые рекомендуются.

17 85

17 ответов:

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

сильная система типов. (...) Это также облегчает неформальное рассуждение о правильности моей программы. Меня интересует правильность, а не эффективность.

акцент скорее на рекурсии чем повторение. (...)

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

  • пренебречь практичностью и пойти на "больше Haskell, чем Haskell": система типа Haskell полна отверстий, из-за нетерминации и других грязных компромиссов. Очистите беспорядок и добавьте более мощные функции, и вы получите такие языки, как Coq и Агда, где тип функции содержит доказательство ее правильности (вы даже можете прочитать стрелку функции -> как логическое следствие!). Эти языки имеют используется для математических доказательств и для программ с чрезвычайно высокими требованиями к корректности. Coq, вероятно, самый выдающийся язык стиля, но Agda имеет более Haskell-y feel (а также написан на самом Haskell).

  • игнорировать типы, добавить больше магии: если Хаскелл-колдовство, Lisp это грубая, первобытная магия творения. Lisp-семейные языки (в том числе схемы и Clojure) имеют почти беспрецедентную гибкость в сочетании с экстремальным минимализмом. Языки практически не имеют синтаксиса, пишут код непосредственно в виде древовидной структуры данных; метапрограммирование на Лиспе проще, чем неметапрограммирование на некоторых языках.

  • компромисс немного и двигаться ближе к мейнстриму: Haskell попадает в широкую семью языков, на которые сильно влияет ML, любой из которых вы, вероятно, могли бы перейти без слишком особых трудностей. Haskell является одним из самых строгих, когда речь заходит о гарантиях корректности от типов и использования функционального стиля, где другие часто либо гибридные стили и/или делают прагматические компромиссы по различным причинам. Если вы хотите некоторое воздействие на ООП и доступ к множеству основных технологических платформ, либо Скала на JVM или F# на .NET имеют много общего с Haskell, обеспечивая при этом простую совместимость с Java и платформы .NET. F# поддерживается непосредственно Microsoft, но имеет некоторые раздражающие ограничения по сравнению с Haskell и проблемами переносимости на платформах, отличных от Windows. Scala имеет прямые аналоги большей части системы типов Haskell и кросс-платформенного потенциала Java, но имеет более тяжелый синтаксис и не имеет мощной поддержки первой стороны, которой пользуется F#.

большинство этих рекомендаций также упоминаются в других ответах, но, надеюсь, мое обоснование для них предлагает некоторое просветление.

Я собираюсь быть тем парнем и предположить, что вы просите не ту вещь.

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

Я бы предложил вам изучить Lisp-т. е. Common Lisp, Scheme/Racket или Clojure. По умолчанию они все динамически типизированы, но есть какой-то намек типа или дополнительный статический ввод. Ракетки и Clojure, вероятно, ваши лучшие ставки.

Clojure является более поздним и имеет больше Хаскеллизмов, таких как неизменность по умолчанию и много ленивой оценки, но он основан на виртуальной машине Java, что означает, что у него есть некоторые нечетные бородавки (например, JVM не поддерживает исключение хвостового вызова, поэтому Рекурсия-это своего рода Хак).

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

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

с точки зрения того, что подходит вашему майору, очевидный выбор кажется логическим языком, таким как пролог или его производные. Логическое программирование может быть сделано очень аккуратно на функциональном языке (см., например Аргументированный Интриган), но вам может понравиться работать с логической парадигмой напрямую.

интерактивная система доказательства теоремы, такая как twelf или coq, также может поразить ваше воображение.

Я бы посоветовал вам узнать Coq, который является мощным помощником доказательства с синтаксисом, который будет чувствовать себя комфортно программист на Haskell. Самое интересное в Coq-это то, что его можно извлечь на другие функциональные языки, включая Haskell. Есть даже пакет (Meldable-Heap) на Hackage, который был написан в Coq, имел свойства, доказанные о его работе, а затем извлеченные в Haskell.

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

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

поскольку вы не упомянули никаких ограничений, кроме ваших субъективных интересов, и подчеркиваете "вознаграждение за обучение" (Ну, хорошо, я проигнорирую ограничение статического ввода), я бы предложил изучить несколько языков разных парадигм, и предпочтительно те, которые являются "образцовыми" для каждого из них.

  • A Lisp диалект для код-как-данные/гомоиконичность вещь и потому, что они хорошие, если не лучшие, примеры динамических (более или менее строгой) функциональные языки программирования
  • Пролог как преобладающий логический язык программирования
  • Smalltalk как один истинный язык ООП (также интересный из-за его обычно чрезвычайно ориентированного на изображение подхода)
  • может быть Эрланг или Clojure если вас интересуют языки, созданные для параллельного/параллельного / распределенного программирования
  • далее для стека ориентированных Программирование
  • (Haskell для строгого функционального статически типизированного ленивого программирования)

особенно Lisps (CL не так много, как Scheme) и Prolog (и Haskell) охватывают рекурсию.

как о стек-ориентированный язык программирования? кошки хиты ваши высокие точки. Это:

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

доктор Доббс опубликовал статейку о кошке в 2008 году, хотя язык немного изменился.

Если вы хотите сильный (er)ly типизированный Пролог, ртуть - интересный выбор. Я баловался им в прошлом, и мне понравилась другая перспектива, которую он дал мне. Он также имеет модальность (какие параметры должны быть свободными/фиксированными) и детерминизм (сколько результатов есть?) в системе типов.

очистить очень похож на Haskell, но имеет типизацию уникальности, которые используются в качестве альтернативы монадам (более конкретно, монада IO). Уникальность типизация также делает интересные вещи для работы с массивами.

Я немного опоздал, но я вижу, что никто не упомянул пару парадигм и связанных с ними языков, которые могут вас заинтересовать своим высоким уровнем абстракции и общности:

несмотря на то, что он не соответствует одному из ваших больших критериев (static* typing), я собираюсь сделать дело для Python. Вот несколько причин, по которым я думаю, что вы должны взглянуть на него:

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

Я, если вы ищете что-то еще понять. Логическое программирование, например, может быть прямо по вашей аллее, как и другие предложенный.


* Я предполагаю, что вы имеете в виду статический ввод здесь, так как вы хотите объявить типы. Технически, Python и строго типизированный язык, так как вы не можете произвольно интерпретировать, скажем, строку как число. Интересно, что есть производные Python, которые позволяют статическую типизацию, например Бу.

Я бы рекомендовал вам Эрланг. Это не сильно типизированный язык, и вы должны попробовать его. Это очень разный подход к программированию, и вы можете обнаружить, что есть проблемы, когда сильная типизация не является лучшим инструментом(TM). В любом случае Erlang предоставляет вам инструменты для статической проверки типа (typer, dialyzer), и вы можете использовать сильную типизацию на деталях, где вы получаете от нее выгоду. Это может быть интересный опыт для вас, но будьте готовы, это будет совсем другое ощущение. Если вы ищете "концептуально интересная парадигма "вы можете найти их в Erlang, передаче сообщений, разделении памяти вместо совместного использования, распределении, OTP, обработке ошибок и распространении ошибок вместо предотвращения ошибок и т. д. Эрланг может быть далеко от вашего текущего опыта, но все еще щекотать мозг, если у вас есть опыт работы с C и Haskell.

учитывая ваше описание, я бы предложил Ocaml или F#.

семья мл вообще очень хороша по отоношению к сильному типу системе. Акцент на рекурсии, в сочетании с шаблоном, тоже понятно.

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

Если бы вы не ставили свои ограничения я бы предложил Python или Эрланг, оба из которых может принять вас из вашей зоны комфорта.

по моему опыту, строгая типизация + акцент на рекурсии означает другой функциональный язык программирования. Опять же, я задаюсь вопросом, очень ли это полезно, учитывая, что ни один из них не будет таким "чистым", как Хаскелл.

Как предложили другие плакаты, Пролог и Lisp / Scheme хороши, хотя оба они динамически типизированы. О схеме в частности было опубликовано много великих книг с сильным теоретическим "вкусом" к ним. Взгляните на SICP, что также передает много общей мудрости информатики (мета-круговые интерпретаторы и тому подобное).

фактор будет хорошим выбором.

вы могли бы начать, глядя на Lisp.

Пролог-это тоже классный язык.

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

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

перейти с одним из основных потоков. Учитывая доступные ресурсы, будущую востребованность вашего мастерства, богатую экосистему разработчиков, я думаю, вы должны начать с любого Java или C#.

Отличный вопрос - я сам недавно задавал его, проведя несколько месяцев, полностью наслаждаясь Haskell, хотя мой фон очень отличается (органическая химия).

Как и вы, C и иже с ним не может быть и речи.

Я колебался между Python и Ruby как две практические рабочие лошадки скриптовых языков сегодня (мулы?), которые имеют некоторые функциональные компоненты для них, чтобы держать меня счастливым. Без запуска каких-либо рубист/дебаты Pythonist здесь, но мой личный прагматичный ответ на этот вопрос:

изучите тот (Python или Ruby), который вы сначала получите повод для подачи заявки.