Haskell AND Lisp vs. Haskell OR Lisp [закрито]


40

В даний час я кодую з C, C ++ та Python. Я хочу підібрати функціональну мову програмування, і зараз я схиляюся до Haskell. Я НЕ хочу тут починати війну "Haskell vs Lisp"; що я хочу знати, це таке: якщо я навчусь Haskell в основному для впливу функціонального програмування, які переваги, якщо такі будуть, я отримаю від пізнього вивчення Lisp?


1
І F # і Clojure.
CND

Відповіді:


58

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

За допомогою Common Lisp ви можете додавати монаси, каррінг і все, що вам сподобалося від Haskell, але ви також отримуєте багатократне успадкування, як згадував Френк Шірар, і загальні функції з багаторазовою відправленням, і розширену систему обробки винятків.

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


6
Я думаю, ти це прибив - що робить Haskell та Smalltalk настільки корисними для навчання, це їх чистота.
Френк Ширар

4
Я погоджуюсь з чистотою, що робить мову набагато простішою. Я не міг зрозуміти функціональну мову сам за допомогою LISP, тому що все можливо на мові, і в мене занадто багато імперативу, фон OO. Але в Haskell немає таких понять, які б порушили навчання.
Еоніль

1
Це смішно, у мене був протилежний досвід. Я підбирав основні моменти функціонального програмування через «Схему», мою першу мову. Я час від часу хакуюсь у Haskell, і я неминуче виявляю, що мені доводиться вивчати 90% + того, що я знав, коли я покидаю Haskell на деякий час. Як сказано, Хаскелл - це надзвичайно багата мова, з величезною кількістю, щоб навчити вас (дуже насильно.) Типи Типи Типи! Дотримуйтесь типів!
Джош Інфіесто

31

І будь ласка.

Haskell навчає вас найчистішого FP, наскільки я знаю принаймні, так само, як Smalltalk навчає найчистішого з OO. (Я згадую це не для того, щоб говорити про те, що OO і FP не можуть одружуватися, а тому, що обидві ці мови є "дорогоцінними" мовами - основна ідея, яка до кінця.)

Lisp - це справді сім'я мов, тому я розповім про Common Lisp, тому що це конкретний член сім'ї, який я використовую.

У Lisp все ще буде багато чого навчити вас:

  • Це багатопарадигма, тому, як вказує dsimcha, вона покаже вам, як інтегрувати FP з іншими парадигмами.
  • Lisp навчить вас, що "код-це-дані, дані-це-код", наприклад, через свої макроси.
  • CLOS - це дуже цікавий бренд ОО, що має багаторазове успадкування, яке працює, і загальні функції.

11

Пізніше навчання Lisp дозволить вам налаштувати Emacs, який, можливо, є найдосконалішим текстовим редактором. Ви не можете цього зробити в Haskell.


14
[Зточує свої дужки]
Інаіматі

6
Можливо, хтось може написати текстовий редактор для цього. Я чую, що операційна система Emacs не має такої. . (Я обманюю , я знаю , що ви можете отримати режим Viper :).
greyfade

14
Насправді є Emacs-клон під назвою Yi, який використовує Haskell точно так само, як Emacs використовує Lisp. Насправді, порівняно з (GNU) Emacs, Yi ще чистіший, тому що його ядро ​​також написано в Haskell, тоді як ядра Emacs, як правило, не пишуться в Lisp. Ядро GNU Emacs написано на C, JEmacs 'написано, наприклад, на Java.
Йорг W Mittag

2
@ Йорг, якщо це часткова реімплементація замість повного клону GNU Emacs або XEmacs, це не те саме. Подібно до порівняння Word з Wordpad або Notepad.

1
@ Турбьерн Равн Андерсен: Так, але не зовсім , що погано. :)
greyfade

11

Хаскелл і Лісп - два абсолютно різні звірі.

Haskell - це "чисте функціональне програмування у вежі зі слонової кістки"

Lisp є kindof "code-is-data / data-is-code / роби власні мовні конструкції". Ви можете маніпулювати кодом будь-яким способом.

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


+1: Хороший момент. Я знаю деяких Haskell і деяких Lisp. Хоча я не знаю жодного з них, я думаю, ви праві, що вони дуже різні. У Haskell ви не маєте ідеї використовувати дані як код. У Lisp у вас немає (AFAIK) узгодження шаблону. Ймовірно, перелік (!) Відмінностей довший.
Джорджіо

7

Основна користь, яку я бачу від вивчення Lisp, полягає в тому, як інтегрувати FP в багатонаціональну мову, орієнтовану на реальний світ, а не лише вивчати її в контексті академічної мови, яка підкреслює чистоту.


5
Я думаю, ти хочеш війни "Haskell vs Lisp"!
Дон Робі

3
Haskell - це академічна мова, яка підкреслює чистоту ... і багато людей використовують її в реальному світі. Малий розмова теж у тому таборі.
Френк Ширар

Багато людей використовують Haskell в реальному світі?
Джон Харроп

1
@Jon Harrop: Ну, я в реальному світі використовую Haskell (і він працює дуже добре для певних програм), можливо, я один із небагатьох (?)
Джорджіо

5

Я також походжу з C / C ++ / Python фону і кілька разів випробовував FP за останні кілька років. Спочатку я дивився на Haskell і не міг зробити його головою чи хвостом, а потім спробував Ocaml, але не отримав багато з цим. Нарешті я почав чути хороші речі про Scala, спробував це, і виявив, що це мені дуже підходить (я також раніше робив трохи Java), до того, що через рік так заскубав у Scala (і відправляв 161 Проблеми проекту Ейлера з цим), схоже, Haskell має набагато більше сенсу. Насправді я лише замовив пару книг про Haskell і хочу ще раз подати її, хоча це багато в чому мотивоване існуванням Scalaz.

Тож я знайшов використання мульти-парадигми (тобто Scala, але Lisp, ймовірно, теж підходив би до законопроекту) хороший шлях до FP. Але якщо ви щасливі зануритися в Haskell (я не був), продовжуйте це робити.


Цікаво, що ти пройшов далі зі Scala, ніж OCaml. Як це?
Джон Харроп

@Jon: Добре запитання; важко сказати. Можливо, я просто не був готовий "ввійти" в функціонал на той час. Можливо, мені щойно вдалося знайти підручник Scala, розміщений на потрібному рівні. Можливо, лінійка C / C ++ / Java Scala просто зробила її трохи чужою. З огляду на будь-яку раціональну ставку в ці дні буде на F #, а не на Scala, я, певно, перегляну домен OCaml в якийсь момент, хоча, оскільки я намагаюся вступити в цей матеріал лише для задоволення від попадання в інший "програмний настрій" для мого C ++ щоденна робота, у мене є збочена схильність повторювати спробу Хаскелла далі.
тайм

Плавний рух підходу :)
Eonil

2

Я спочатку походив із C / C ++ / Ruby і використовував FP-концепції в Ruby, коли тільки міг. Держава якимось чином зачепила мій мозок. Один день мене подзвонив один з моїх приятелів, і він попросив мене написати щось на Haskell (моя перша - і, сподіваюся, не остання - робота Haskell!). Я швидко вивчив мову, і разом зв'язав щось, що спрацювало. Це було не красиво чи нічого, але це спрацювало.

Я взяв місячну перерву від Haskell, тому що мені не було чим користуватися. Але коли я вирішив, що потрібно написати власне програмне забезпечення для блогу, я застосував Haskell ( https://symer.io ). Haskell справді крутий, тому що ви можете розбити проблему на частини та реалізувати ці частини по-різному на основі введення. Haskell також надзвичайно добре справляється з відмовою завдяки розумному боксуванню цінностей. Для роботи з цими скриньками існує стільки інструментів, що ви просто забудете, що вони існують.

Мій досвід роботи з lisp (Схема) був повністю негативним. Мові не тільки бракувало цих розумних, простих інструментів, вона виглядала так само небезпечно, як Ruby або JavaScript. Це було жахливе враження, і воно не пропонує нічого нового, крім Рубі чи Пітона.

C ++ не може потримати свічку до Haskell, поза межами управління пам'яттю. Haskell так само швидкий (якщо не швидший), значно більш короткий і набагато безпечніший. Але безпека Haskell ніколи не заважає.

TL; TR Haskell - це подих свіжого повітря, а Lisp - трохи більш функціональний Ruby.

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