Які переваги використання LISP та Haskell? Чи зроблять мене кращим програмістом? [зачинено]


41

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


36
Використання LISP та Haskell зробить вас кращим програмістом LISP та Haskell, я гарантую це.
Ніл

17
@MasonWheeler Я мушу сказати; У системі типів Haskell є багато, яку ви не знайдете жодної іншої мови, а макросів LISP ніде не знайдено в жодних основних мовах. Обидві ці речі варто навчання , тому що вони дійсно зробити вас кращим програмістом в вашому робочому мовою. Принаймні, це був мій досвід; Haskell зробив мене кращим фірмовим розробником C #. Я знаю методики чіткого здійснення розділення проблем, які ніколи б у мене не було, і розбір проблем назавжди буде для мене набагато простішим, ніж до того, як я дізнався Haskell.
Джиммі Хоффа

6
Ерланг - це функціональна мова. Кролик MQ написаний на Ерланг, і Кролик використовується в багатьох місцях, щоб виконувати багато важких важких підйомів. Функціональні мови вчать вас думати по-різному про програмування, і це приємний додатковий інструмент, який ви матимете у своєму розпорядженні. Хоча це правда, деякі з цих понять перетворили його на більш популярні мови (наприклад, лямбда-вирази в C # і C ++), ви все одно підходите до вирішення проблем зовсім по-іншому, використовуючи функціональну мову.
Бінарний страшник

8
@MasonWheeler Є цілком вагомі причини, що мова може бути кориснішою за решту, але все ще не використовується широко. Я можу подумати про багато: існуюча база користувачів, занадто радикальна зміна, коли "хороший достатньо хороший", а також ... коли для кращого інструменту потрібні більш формально підготовлені програмісти. Тож популярність не є хорошим показником корисності .
Андрес Ф.

5
@MasonWheeler Для використання аналогії математика є надзвичайно корисним полем у реальному житті. То чому б більше людей не знає математику? Чому дуже багато людей лякається цього, і думають, що це чорна магія і насправді не все так корисно?
Андрес Ф.

Відповіді:


37

Це дуже схоже на те, що вивчення математики покращить ваші аналітичні навички, а вивчення латинської / класичної літератури поліпшить ваші навички письма.

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

Однак, вивчення Java також зробить вас кращим програмістом. І навчання С. Справжню користь отримує вивчення мов з різною філософією. Тоді ви можете мати власну думку про те, як повинна бути написана програма.

Редагувати

Я усвідомлюю, що ця відповідь не настільки корисна для людей, які ще не вивчили haskell та / або lisp. Ось кілька прикладів для подальшого пояснення того, що я маю на увазі

LISP

Лісп вважає, що синтаксис повинен бути мінімальним, і що все повинно бути або списком, або примітивним (Лісп розшифровується як Обробка списку). Навіть програми - це в основному список, що містить інші списки та символи. Lisp дозволяє вам маніпулювати програмами як списком та генерувати нові програми на ходу. Звідси і весь code is data and data is codeдевіз.

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

(defroutes app-routes
  (GET "/" [] view/page)
  (GET "/api" [] (wrap-aleph-handler api/socket-handler))
  (route/resources "/static")
  (route/not-found "page not found"))

Ще одним приємним прикладом є рамка для шаблону ікони:

(html [:ul
  (for [x (range 1 4)]
    [:li x])])

Як бачите, результат такий же короткий, як у DSL, як вуса, але дозволяє використовувати мовні функції, такі як (for [x (range 1 4)] block). Ще приємніше, у вас є всі інструменти для абстрактності та структури вашого коду.

В інших мовах синтаксис складніший. Не можна читати програму Java як купу списків. Але використовуючи Lisp, ви отримуєте краще уявлення про те, як повинен виглядати ідеальний інтерфейс, і що у вашому коді можна абстрагувати як дані. Це також допомагає вам бачити свою улюблену мову як велику структуру даних та краще розуміти її семантику.

Хаскелл

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

Одним із наслідків є те, що ви не можете виконувати IO дії, коли захочете (haskellers вважає, що це добре). Дії IO визначаються як транзакції, які самі по собі є чистою цінністю. mainВартість програми Haskell є операцією введення - виведення виконується при запуску програми.

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

Ще одна особливість, яку згадував Джиммі Хоффа, - система багатого типу. Хоча в інших мовах є статичне введення тексту, у haskell ви можете мати такі речі, як:

length :: [a] -> Int (функція зі списку символів до int)

map :: (a -> b) -> [a] -> [b](функція, яка приймає a to bперетворення та список a, повертає список b)

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

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

Або ви берете безпечний шлях (наприклад, scala) і закінчуєте дійсно складною мовою, або ви берете простий шлях і отримуєте щось, що є обмеженим (дженерики google go обмежені списком і картами) або небезпечним (джинсові дженерики, які завжди є коваріант).

Використовуючи haskell, ви в основному дізнаєтесь про переваги чистоти та про те, як писати чистий код.


1
@JimmyHoffa Я думаю, що насправді заслуговує на власну відповідь, тому що люди, як правило, не помічають. Є проблемні домени, найкраще вирішені за допомогою функціонального програмування, які люди навіть не здогадуються про існування, поки вони принаймні не спрацюють у цих областях за межами зони комфорту.
KChaloux

2
Я не знаю про Асамблею, і про це я також не згадував. Однак збірка може допомогти вам зрозуміти, як працюють ваші програми. Є велика публікація про SO людей, які здатні проаналізувати фрагмент створеної збірки для того, щоб пояснити проблему ефективності.
Саймон Бергот

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

7
OMG, @Neil знаючи , що комп'ютер насправді робить більшість безсумнівно зробить вас кращим програмістом. Я не писав складання роками, але регулярно читаю це (на купі платформ), і якщо ви дбаєте про те, як ваша програма насправді працює, важливо знати хоча б основи.
Даш-Том-Банг

3
@Neil, в якому випадку гірший програміст приносить користь? Що змушує вас створити код спагетті? Що стосується коду спагетті зі складанням або бути хорошим програмістом, окрім випадків, коли у фантастичному краї не знають складання та потребують раціоналізації, щоб уникнути його вивчення? Якщо що-небудь, то, що хороший кодер для складання дає змогу чудово усвідомлювати погані практики кодування.
dash-tom-bang

12

tl; dr Навчання нових речей може зробити вас лише кращим програмістом, але бути кращим програмістом - це не про мови, на яких можна писати код.

Які переваги використання LISP та Haskell?

LISP:

  1. Гомоїконічний код. Це дозволяє структурувати самомодифікуючий код.
  2. Макроси, що знають синтаксис Вони дозволяють переписати код котла.
  3. Прагматизм. CL призначений для того, щоб зробити роботу робочими професіоналами. Як правило, більшість функціональних мов не є.
  4. Гнучкість. Він може робити багато різних речей, і все з розумною швидкістю.
  5. Бородавість. Реальний світ безладний. Прагматичне кодування закінчується тим, що потрібно використовувати або вигадувати брудні конструкції. Звичайний Лісп має достатню бородавість, щоб він міг виконувати речі.

Можливо, єдиною реальною причиною вибору проти CL є те, що стандартні бібліотеки датовані.

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

З: Чому Лісп корисний?

Haskell:

Haskell - мова комп'ютерного програмування. Зокрема, це поліморфно статично типова, лінива, суто функціональна мова, зовсім відмінна від більшості інших мов програмування. Мова названа за Haskell Brooks Curry, робота якого з математичної логіки служить основою для функціональних мов. Haskell заснований на обчисленні лямбда, звідси і лямбда, яку ми використовуємо як логотип.

Ви можете прочитати там опис функціоналу проти імперативу

Від: http://www.haskell.org/haskellwiki/Вступ

Чи зроблять мене кращим програмістом?

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

Не існує жодного інструмента, єдиної книги, єдиної парадигми програмування, яка зробить вас кращим програмістом.

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

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

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

Наприклад, ви можете додавати корисні коментарі до свого коду, дбаючи про читаність вашого коду, ремонтопридатність. Зверніть увагу на дрібні деталі. Подумайте, перш ніж набрати! Дізнайтеся про моделі дизайну. Дотримуйтесь належних практик.

Розкриття: Це безсоромна реклама найгіршого виду, тому що це з мого блогу.


4
Ви дізналися LISP або Haskell на будь-якому компетентному рівні?
Джиммі Хоффа

10
Трохи нечесно чути це від того, хто майже нічого не знає жодної мови. Ви стверджуєте, що це не інструменти, які вам потрібні зараз, але ви не знаєте, для чого вони інструменти, тож як ви можете це знати? Крім того, як ви можете порадити комусь, що вони хочуть чи не хочуть навчитися у них, наскільки ви знаєте, що LISP є похідною SQL, корисною лише для реляційного аналізу даних, і Haskell може бути суворим підмножиною Regexp.
Джиммі Хоффа

10
Це насправді не відповідає на питання. Вам вдалося зробити вражаючий подвиг дати невиразну загальну відповідь на питання про дві мови, яких ви не знаєте: /
Андрес Ф.

2
-1 тому що це розпливчасто танцює навколо того , чого саме вас вчать Common Lisp та Haskell. Приклади: Код як дані даних у вигляді коду, чистоти, референтної прозорості, монадичних абстракцій, функціонального програмування, мовно-орієнтованого програмування, типового програмування тощо тощо
jozefg

3
Крім того, не знаючи жодної мови, я не думаю, що ви можете відповісти на це питання: / Вибачте
jozefg

9

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

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

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