Какой язык нужно изучать после Haskell?

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

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

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

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

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

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

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

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

Спасибо всем за ваши рекомендации! Похоже, что рекомендуется использовать Lisp (Scheme, Clojure), Prolog или помощник проверки, такой как Coq или Agda.

Ответ 1

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

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

Акцент на рекурсии, а не на итерации. (...)

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

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

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

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

Ответ 2

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

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

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

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

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

Макросистемы в Lisps очень интересны и значительно более мощны, чем все, что вы увидите где-нибудь еще. Это само по себе стоит хотя бы посмотреть.

Ответ 3

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

Интерактивная теоретическая система доказательства, такая как twelf или coq, может также поразить вашу фантазию.

Ответ 4

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

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

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

Ответ 5

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

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

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

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

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

Ответ 6

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

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

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

Ответ 7

Если вам нужен сильный (er) лиложенный Prolog, Mercury - интересный выбор. В прошлом я занимался этим, и мне нравилась другая перспектива, которую он мне дал. Он также имеет moded-ness (какие параметры должны быть свободными/фиксированными) и детерминизм (сколько результатов есть?) В системе типов.

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

Ответ 9

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

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

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


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

Ответ 10

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

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

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

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

Ответ 11

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

Ответ 12

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

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

Ответ 13

Factor будет хорошим выбором.

Ответ 14

Вы можете начать поиск Lisp.

Пролог - классный язык.

Ответ 15

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

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

Ответ 16

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

Ответ 17

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

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

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

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