В качестве моего первого языка программирования я решил изучить 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.