Це дуже схоже на те, що вивчення математики покращить ваші аналітичні навички, а вивчення латинської / класичної літератури поліпшить ваші навички письма.
Люди, які розробили ці мови, дуже задумалися над тим, що означає написання програми. І ці мови є результатами цих досліджень.
Однак, вивчення 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, ви в основному дізнаєтесь про переваги чистоти та про те, як писати чистий код.