Яку мову вивчати після Хаскелла? [зачинено]


85

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

Проте програмування в Haskell схоже на чаклунство, і я хотів би розширити свої знання програмування. Я хотів би вибрати нову мову програмування для вивчення, але мені не вистачає часу, щоб підібрати довільну мову, кинути її та повторити. Тож я подумав поставити тут питання разом із кількома умовами щодо типу мови, яку я шукаю. Деякі суб’єктивні, інші призначені для полегшення переходу від Хаскелла.

  • Сильна система типу. Однією з моїх улюблених частин програмування в Haskell є написання декларацій типу. Це допомагає структурувати мої думки про окремі функції та їх зв’язок із програмою в цілому. Це також полегшує неофіційні міркування щодо правильності моєї програми. Мене турбує коректність, а не ефективність.
  • Акцент на рекурсії, а не на ітерації. Я використовую ітеративні конструкції в Haskell, але реалізую їх рекурсивно. Однак набагато легше зрозуміти структуру рекурсивної функції, ніж складна ітераційна процедура, особливо при використанні комбінаторів та функцій вищого порядку, таких як карти, складки та прив'язка.
  • Нагорода за навчання. Haskell - це корисна мова для роботи. Це трохи схоже на читання Канта. Мій досвід декількох років тому з C, проте, не був. Я не шукаю C. Мова повинна застосовувати концептуально цікаву парадигму, чого, на мою цілком суб'єктивну думку, C-лайки не роблять.

Зважування відповідей : Звичайно, це лише примітки. Я просто хотів би відповісти усім, хто дав чітко сформовані відповіді. Ви дуже допомогли.

1) Кілька відповідей показали, що сильна, статично набрана мова, що підкреслює рекурсію, означає іншу функціональну мову. Хоча я хочу продовжувати активно працювати з Хаскеллом, Камканн та Ларсманс правильно зазначили, що інша така мова "занадто полегшить перехід". Ці коментарі були дуже корисні, тому що я не хочу писати Haskell у Caml! З асистентів доказу Кок і Агда виглядають цікаво. Зокрема, Coq дасть вагомий вступ до конструктивної логіки та формальної теорії типу. Я провів трохи часу з предикатом першого порядку та модальною логікою (Менделсон, Ендертон, дещо з Хінмана), тому, мабуть, мені було б дуже весело з Coq.

2) Інші вкрай сприятливі Lisp (Common Lisp, Scheme та Clojure). З того, що я зібрав, як Common Lisp, так і Scheme мають чудові вступні матеріали ( Про Lisp і The Reasoned Schemer , SICP ). Матеріали в SICP змушують мене схилятися до схеми. Зокрема, схема через SICP охоплювала б іншу стратегію оцінки, реалізацію лінощів та можливість зосередитись на таких темах, як продовження, інтерпретатори, символічні обчислення тощо. Нарешті, як зазначали інші, обробка кодом / даними Ліспа була б абсолютно новою. Отже, я сильно схиляюся до варіанту (2), Lisp.

3) По-третє, Пролог. Пролог має безліч цікавих матеріалів, і основних доменом є саме той, який мене цікавить. Він має простий синтаксис і легко читається. На даний момент я не можу більше коментувати, але, прочитавши огляд Прологу та знявши деякі вступні матеріали, він посідає місце (2). І здається, що зворотне відстеження Пролога завжди зламується на Haskell!

4) З основних мов Python виглядає найцікавішим. Тім Йейтс робить мови дуже привабливими. Очевидно, Python часто викладають на спеціальностях CS першого курсу; тож це або концептуально багате, або його легко вивчити. Мені доведеться провести більше досліджень.

Дякую всім за рекомендації! Схоже, Lisp (Схема, Clojure), Пролог або асистент, як Coq або Agda, є основними рекомендованими мовами.


34
2,5 місяці - це недостатньо часу для глибокого вивчення будь-якої мови, вибачте, що ви лопнули.
Woot4Moo

20
Це, звичайно, правда. Я не мав на увазі, що я "дізнався" Хаскелла, що б це не означало. Я мав на увазі, що почуваю себе комфортно, користуючись мовою. Я явно не перестану його вчитися.
данпортин

10
@Michael: Кодування для правильності замість ефективності - це те, чого я хотів би бачити більше ...
Деніз Доган

24
@ Woot4Moo: 2,5 місяці - це достатньо часу, щоб "почуватись" з мовою. Це подвійно, якщо він знайомий з формальною логікою та працює з абстрактними поняттями з його філософії. У цьому випадку також допомогло б не вивчення звичок з інших мов.
CA McCann

8
@gnovice: Звичайно, це запитували багато разів. Але я вперше стикаюся з кимось, хто зробив свій перший серйозний досвід програмування з Haskell. Це ніби стрілка часу перевернута чи щось інше.
Мухаммед Алкарурі

Відповіді:


85

Я хотів би розширити свої знання з програмування. (...) Я думав, що поставлю тут питання разом із кількома умовами щодо типу мови, яку я шукаю. Деякі суб’єктивні, інші призначені для полегшення переходу від Хаскелла.

Сильна система типу. (...) Це також полегшує неофіційні міркування щодо правильності моєї програми. Мене турбує правильність, а не ефективність.

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

Можливо, ви боїтесь тут занадто сильно полегшити перехід. Дуже сувора система типу і суто функціональний стиль характерні для Haskell, і майже все, що нагадує загальноприйняту мову програмування, потребуватиме компрометації хоча б дещо з них. Отож, маючи це на увазі, ось кілька загальних пропозицій, спрямованих на збереження більшості того, що вам здається подобається в Хаскелі, але з певними серйозними змінами.

  • Нехтуйте практичністю і йдіть на "більше Haskell, ніж Haskell" : система типу Haskell повна дір, через невирішення та інші безладні компроміси. Очистіть безлад і додайте більш потужні функції, і ви отримаєте такі мови, як Coq та Agda , де тип функції містить доказ її правильності (ви навіть можете прочитати стрілку функції ->як логічне значення!). Ці мови використовувались для математичного підтвердження та для програм з надзвичайно високими вимогами до коректності. Coq - це, мабуть, найвидатніша мова стилю, але Агда відчуває більше відчуття хаскель-і (як і написання в самому Хаскелі).

  • Нехтуйте типами, додайте більше магії : якщо Haskell - це чаклунство, Lisp - це сира, первинна магія творіння. Мови сімейства Lisp (включаючи Scheme та Clojure ) мають майже неперевершену гнучкість у поєднанні з надзвичайним мінімалізмом. Мови по суті не мають синтаксису, пишучи код безпосередньо у вигляді деревної структури даних; метапрограмування в Lisp простіше, ніж немета-програмування в деяких мовах.

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

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


4
У сім'ї Coq та Agda ви також можете подивитися на Ци II .
Hynek -Pichi- Vychodil

Які б були прикрі обмеження F #, на вашу думку? Як хтось, хто вивчає F # у вільний час, мені цікаво це знати.
Лукас

7
@Lucas: Великий і голий кістки Haskell - відсутність вищого типу поліморфізму та класів типу. Окрім цього, досить багато розширень, характерних для GHC , дуже приємні. Ніщо з цього не є фатальним недоліком, але після звикання до Хаскелла він просто здається незграбним, не маючи цього. Уявіть, що ви переходите від сучасного C # до використання C # 1.x ...
CA McCann

@HyneK: Ця мова Qi 2 на перший погляд здається дуже цікавою та більш гнучкою, ніж Coq або Adga. Здається, хоча автор вирішив назвати це відмовою. Чи є якийсь рух для продовження роботи над цією мовою? Я не хотів би дізнатися щось, що вже напівмертво.
Алекс

@Alex: схоже, це продовжується як Shen: shenlanguage.org
amindfv

20

Я буду Тим Хлопцем і припущу, що ти просиш не про те.

Спочатку ви говорите, що хочете розширити свій кругозір. Потім ви описуєте ту мову, яку хочете, і її горизонти неймовірно звучать як горизонти, які у вас вже є. Ви не збираєтеся дуже багато отримувати, вивчаючи одне і те ж знову і знову.

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

Clojure є нещодавнім і має більше хаскелізмів, таких як незмінність за замовчуванням і багато ледачої оцінки, але він заснований на віртуальній машині Java, що означає, що у нього є деякі дивні бородавки (наприклад, JVM не підтримує елімінацію хвостового виклику, тому рекурсія є якоюсь рубати).

Ракетка набагато старший, але на цьому шляху набрав багато енергії, наприклад, підтримку статичного типу та зосередження на функціональному програмуванні. Думаю, ви, мабуть, отримаєте максимум від Рекет.

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


3
Хе, з точки зору Хаскелла, натяк на тип або необов’язковий статичний набір тексту насправді не відрізняються від повністю динамічного набору тексту. Це зовсім інше мислення. Тим не менш, мови Lisp-y - це всілякі розваги, і я думаю, що кожен програміст повинен витратити хоча б трохи часу на навчання.
CA McCann

19

З точки зору того, що підходить вашому спеціальності, очевидний вибір здається логічною мовою, такою як Prolog або її похідні. Програмування логіки можна виконувати дуже акуратно на функціональній мові (див., Наприклад, « Обгрунтований схема» ), але вам може сподобатися робота з логічною парадигмою безпосередньо.

Інтерактивна система доведення теорем, така як twelf або coq, також може вам сподобатися.


2
Оскільки ви заявляєте інтерес до сильно набраної мови, я б рекомендував lambdaProlog, типову мову логічного програмування вищого порядку. Однією зі складених реалізацій є Teyjus - code.google.com/p/teyjus (розкриття інформації: я працював над Teyjus).
Zach Snow

18

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

Ще однією популярною мовою, яка пропонує більше потужності, ніж Хаскелл, є Agda - я не знаю Agda, крім того, що я знаю, що вона набирається залежно від Хакеру і добре поважається людьми, яких я поважаю, але це досить вагомі причини для мене.

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


1
Agda справді звучить як природний "наступний крок" від Haskell.
Деніз Доган

5
Варто також зазначити, що якщо він, як фахівець філософії, має великий досвід роботи з формальною логікою, асистенти, що працюють у стилі Каррі-Говарда, цілком можуть бути для нього менш незрозумілими, ніж для більшості ветеранів-програмістів!
CA McCann

11

Оскільки ви не згадували жодних обмежень, крім своїх суб'єктивних інтересів, і наголошували на тому, що "корисно вчитися" (ну, гаразд, я ігноруватиму статичне обмеження набору тексту), я б запропонував вивчити кілька мов різних парадигм, і бажано тих, які є "зразковими" для кожного з них.

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

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

Хоча я не гуру жодної з цих мов, я проводив деякий час із кожною з них, за винятком Ерланга та Форта, і всі вони дали мені відкриваючі очі та цікавий досвід навчання, оскільки кожна з них підходить до вирішення проблем з іншого боку .

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


Я не міг витримати обмежень Ерланга, що стосуються опікунів;)
Горський

10

Як щодо мови програмування, орієнтованого на стек ? Кіт вражає ваші високі бали. Це є:

  • Статично набрано з висновком типу.
  • Змушує вас переосмислити загальноприйняті імперативні мови, такі як цикл. Умовне виконання та циклічність обробляються комбінаторами .
  • Винагорода - змушує зрозуміти ще одну модель обчислень. Дає вам інший спосіб думати про проблеми та розкладати їх.

Доктор Доббс опублікував коротку статтю про Кота в 2008 році, хоча мова дещо змінилася.


10

Якщо ви хочете міцний (а) набраний Пролог, Меркурій - цікавий вибір. Я бачив це в минулому, і мені сподобалася інша перспектива, яку вона мені дала. Він також має модифікованість (які параметри повинні бути вільними / фіксованими) та детермінізм (скільки результатів є?) У системі типів.

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



8

Незважаючи на те, що він не відповідає одному з ваших основних критеріїв (статичне * введення тексту), я збираюся висловити аргумент для Python. Ось кілька причин, я думаю, вам варто поглянути на це:

  • Для імперативної мови це напрочуд функціонально. Це було одне з того, що мене вразило, коли я про це дізнався. Візьмемо , наприклад, розуміння списку . Він має лямбди, першокласні функції та безліч функціонально натхнених композицій на ітераторах (карти, складки, блискавки ...). Це дає вам можливість вибрати будь-яку парадигму, яка найбільше відповідає проблемі.
  • IMHO, це, як і Haskell, красиво кодувати. Синтаксис простий і елегантний.
  • У ньому є культура, яка зосереджується на тому, щоб робити речі прямолінійно, а не надто дрібничко на ефективності.

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


* Я припускаю, що ви маєте на увазі статичне введення тут, оскільки ви хочете оголосити типи. Технічно, Python - це сильно набрана мова, оскільки ви не можете довільно інтерпретувати, скажімо, рядок як число. Цікаво, що існують похідні Python, які дозволяють статичне введення, наприклад Boo .


Сильна система типу не обов'язково означає лише "статичну" типізацію.
Деніз Доган

+1 також бачу мій коментар щодо відповіді Ларсмана. Але будьте обережні, щоб рекламувати Python як досить функціональний. Наприклад, генераторним виразам, як правило, надають перевагу над mapі filterт. Д. Але все-таки генератори та генераторські вирази почуватимуться знайомими тому, хто знає ледаче оцінювання та згадані функції.

16
Справді? Я думаю, що Python здебільшого здається особливо функціональним для людей, які не надто багато функціонально програмували. Я використовував і Python, і Haskell неабияку кількість, і хоча Python є приємною мовою, і, безсумнівно, запозичив кілька речей з функціональних мов, це все ще на 99% обов’язково.
CA McCann

@camccann Ви маєте рацію - моя точка зору інша, саме тому я просто пропоную це як цікаву альтернативу. Як хтось, хто вивчив імперативне програмування першим, я розумію, що Python дозволяє мені використовувати функціональні прийоми там, де вони є доречними, і уникати їх там, де щось інше має сенс. Я не вважаю, що він "є" функціональним - лише те, що він робить хороший компроміс.
Tim Yates

Звички, отримані у Haskell, можуть зробити вас набагато кращим програмістом на Python, ніж інші, хто вивчив її як першу мову.
u0b34a0f6ae

8

Я б порекомендував вам Ерланг. Це не сильно набрана мова, і вам слід спробувати. Це дуже різний підхід до програмування, і ви можете виявити, що існують проблеми, коли сильний набір тексту - не найкращий інструмент (TM). У будь-якому випадку Erlang надає вам інструменти для статичної перевірки типу (машинка, діалізатор), і ви можете використовувати сильний набір тексту на деталях, де ви отримуєте від цього вигоду. Це може бути цікавим досвідом для вас, але будьте готові, це буде зовсім інше почуття. Якщо ви шукаєте "концептуально цікаву парадигму", ви можете знайти їх в Erlang, передача повідомлень, розділення пам'яті, а не спільне використання, розподіл, OTP, обробка помилок і поширення помилок замість "попередження помилок" тощо. Ерланг може бути далеко від вашого поточного досвіду, але все одно лоскоче мозок, якщо у вас є досвід роботи з С та Хаскеллом.


8

Враховуючи ваш опис, я б запропонував Ocaml або F # .

Сімейство ML, як правило, дуже добре з точки зору сильної системи типу. Акцент на рекурсії в поєднанні з узгодженням шаблонів також є зрозумілим.

Де я трохи вагаюся, це корисна частина навчання . Навчання їх було для мене корисно, без сумніву. Але з огляду на ваші обмеження та опис того, що ви хочете, здається, ви насправді не шукаєте чогось набагато іншого, ніж Хаскелл.

Якби ви не встановили обмежень, я б запропонував Python або Erlang , і те, і інше вивело б вас із зони комфорту.


6

З мого досвіду, сильний набір тексту та наголос на рекурсії означає іншу функціональну мову програмування. Знову ж, мені цікаво, чи це дуже корисно, враховуючи, що жоден з них не буде таким «чистим», як Хаскелл.

Як припускають інші плакати, Prolog та Lisp / Scheme приємні, хоча обидва вони динамічно набираються. Багато чудових книг із сильним теоретичним "смаком" до них видано зокрема про Схему. Погляньте на SICP , який також передає багато загальної інформатики (інформаційні перекладачі тощо).


4
+1 для першого абзацу, саме те, про що я думав, коли читав питання. Задля вивчення нових речей, я б запропонував сучасну імперативну мову, таку як Python, - тим більше, що це не те, що використовував OP (динамічне введення тексту, ітератори скрізь тощо). У ньому також є дуже круті вдосконалені концепції, такі як метакласи або генератори (які разюче схожі на ледачі списки) / вирази генератора (які служать узагальненням розуміння списків + генераторів). Крім того, правило диктування та встановлення розуміння.

3
@delnan: Haskell також має розуміння списків, і генератори / ітератори можуть бути легко виражені в Haskell, використовуючи стандартний тип списку Haskell. Тож найбільшими відмінностями між цими двома мовами, на мій погляд, є об’єктно-орієнтоване програмування та (найчастіше) нечисті структури даних, такі як словники.
Деніз Доган

1
@ Деніз Доган: не забувайте про відсутність декларацій та належного лексичного обсягу в Python.
Fred Foo


5

Ви можете почати роздивлятися Lisp .

Пролог - теж крута мова.


5

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

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


0

Пройдіть одним з основних потоків. Враховуючи наявні ресурси, майбутню товарність вашої майстерності, багата екосистема розробника, я думаю, вам слід почати з Java або C # .


14
Порівняно з Haskell, обидва є досить кульгавими мовами IMO.
missingfaktor

9
Просити Хаскеллера переїхати на Яву - це все одно, що просити Білла Гейтса переїхати до нетрі. : - /
missingfaktor

1
+1 за пропозицію чогось, що, безумовно, приведе вас до голосу. Java і C # мають приємні екосистеми і дуже рекомендуються для серйозної роботи. Безсумнівно, ви можете використовувати свої знання про Haskell (, Java та C #) при використанні Clojure на JVM або F # на CLR.
ponzao

6
@ponzao: Ні, ні, якщо говорити про те, що хтось переходить із Haskell на Java або C #, це просто жахливо і жорстоко. Scala, F # та Clojure - набагато приємніші мови з тими самими перевагами, які отримує робота на JVM / CLR.
CA McCann

5
Для аналітичної філософії основні Java або C # - марні витрати часу.
MaD70

0

Чудове запитання - я сам задавав його нещодавно, провівши кілька місяців, насолоджуючись Хаскеллом, хоча моє походження зовсім інше (органічна хімія).

Як і ви, С та подібні не можуть бути обговорені.

Я коливаюся між Python і Ruby як дві практичні мови сценаріїв робочих коней сьогодні (мули?), Які обидва мають деякі функціональні компоненти, щоб зробити мене щасливим. Не починаючи тут жодних дебатів рубістів / піфоністів, але моя особиста прагматична відповідь на це запитання:

Вивчіть той (Python чи Ruby), для якого спочатку ви отримуєте привід застосувати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.