В качестве своего первого языка программирования я решил изучить Haskell. Я специализируюсь на аналитической философии, и Haskell позволил мне быстро и правильно создавать интересные программы, например, преобразователи для синтаксического анализа естественного языка, средства доказательства теорем и интерпретаторы. Хотя я занимаюсь программированием всего два с половиной месяца, я обнаружил, что семантика и синтаксис Haskell намного проще для изучения, чем более традиционные императивные языки, и чувствую себя комфортно (сейчас) с большинством его конструкций.
Однако программирование на Haskell похоже на волшебство, и я хотел бы расширить свои познания в программировании. Я хотел бы выбрать новый язык программирования для изучения, но у меня нет времени, чтобы выбрать произвольный язык, отбросить его и повторить. Поэтому я подумал, что задам вопрос здесь, а также несколько оговорок о типе языка, который я ищу. Некоторые из них субъективны, некоторые предназначены для облегчения перехода с Haskell.
- Система сильных типов. Одна из моих любимых частей программирования на Haskell - это написание объявлений типов. Это помогает структурировать мои мысли об отдельных функциях и их отношении к программе в целом. Это также упрощает неформальные рассуждения о правильности моей программы. Меня волнует правильность, а не эффективность.
- Упор на рекурсию, а не на итерацию. Я использую итеративные конструкции в Haskell, но реализую их рекурсивно. Однако гораздо легче понять структуру рекурсивной функции, чем сложную итеративную процедуру, особенно при использовании комбинаторов и функций высшего порядка, таких как карты, складки и связывание.
- Полезно учиться. Haskell - полезный язык для работы. Это немного похоже на чтение Канта. Однако у меня несколько лет назад этого не было. Я не ищу C. Язык должен обеспечивать концептуально интересную парадигму, чего, по моему полностью субъективному мнению, C-like не делают.
Взвешивание ответов : это, конечно, всего лишь заметки. Я просто хочу ответить всем, кто дал правильные ответы. Вы мне очень помогли.
1) В нескольких ответах указано, что сильный статически типизированный язык с акцентом на рекурсию означает другой функциональный язык. Хотя я хочу и дальше активно работать с Haskell, camccann и larsmans правильно отметили, что другой такой язык «слишком облегчит переход». Эти комментарии были очень полезны, потому что я не собираюсь писать Haskell на Caml! Из помощников по доказательству интересно выглядят Coq и Agda. В частности, Coq предоставит основательное введение в конструктивную логику и формальную теорию типов. Я потратил немного времени на предикаты первого порядка и модальную логику (Mendellsohn, Enderton, некоторые из Hinman), так что, вероятно, мне бы очень понравилось работать с Coq.
2) Другие сильно отдали предпочтение Lisp (Common Lisp, Scheme и Clojure). Из того, что я понимаю, как Common Lisp и Scheme имеют отличный вводный материал ( On Lisp и мотивированный Schemer , SICP ). Материал в SICP заставляет меня склоняться к Scheme. В частности, Scheme через SICP будет охватывать другую стратегию оценки, реализацию лени и возможность сосредоточиться на таких темах, как продолжения, интерпретаторы, символьные вычисления и т. Д. Наконец, как отмечали другие, обработка кода / данных в Lisp была бы совершенно новой. Следовательно, я сильно склоняюсь к варианту (2), Lisp.
3) В-третьих, Пролог. В Prolog есть масса интересного материала, и его основная область как раз то, что мне интересно. У него простой синтаксис, и его легко читать. На данный момент я не могу комментировать больше, но после прочтения обзора Prolog и беглого просмотра некоторых вводных материалов он занимает место (2). И кажется, что возврат Пролога всегда взламывается в Haskell!
4) Из основных языков наиболее интересным выглядит Python. Тим Йейтс заставляет языки звучать очень привлекательно. Судя по всему, Python часто преподают на первых курсах специализации CS; так что он либо концептуально богат, либо его легко освоить. Придется провести дополнительные исследования.
Всем спасибо за рекомендации! Похоже, что основными рекомендуемыми языками являются Lisp (Scheme, Clojure), Prolog или помощник по проверке, такой как Coq или Agda.