Я збираюся замовити цей довідник за рівнем майстерності, яку ви маєте в Haskell, переходячи від абсолютного початківця аж до експерта. Зауважте, що цей процес займе багато місяців (років?), Тому він досить тривалий.
Абсолютний новачок
По-перше, Haskell здатний на що завгодно, з достатньою майстерністю. Це дуже швидко (за моїм досвідом лише C і C ++), і його можна використовувати для будь-якого, від моделювання до серверів, guis та веб-додатків.
Однак є деякі проблеми, про які легше написати новачка в Haskell, ніж інші. Математичні проблеми та перелік програмних процесів є хорошими кандидатами для цього, оскільки для їх запису потрібні лише основні знання Haskell.
По-перше, кілька хороших посібників для вивчення самих основ Haskell - це навчальний посібник зі щасливим вивченням haskell та перші 6 глав, які вивчають вам haskell . Читаючи їх, дуже гарна ідея також вирішувати прості проблеми з тим, що ви знаєте.
Ще два хороших ресурси - програмування Haskell з перших принципів та програмування в Haskell . Вони обидва входять з вправами для кожної глави, тому у вас є невеликі прості проблеми, пов'язані з тим, що ви дізналися на останніх кількох сторінках.
Хороший список проблем, які слід спробувати, - це сторінка проблем haskell 99 . Вони починаються дуже елементарно, і стає складніше, як ви продовжуєте. Дуже добре, що багато таких роблять, оскільки вони дозволяють вам практикувати свої навички в рекурсії та функціях вищого порядку. Я рекомендую пропустити будь-які проблеми, які вимагають випадковості, оскільки це в Хаскеллі трохи складніше. Перевірте це питання ТАК, якщо ви хочете перевірити свої рішення за допомогою QuickCheck (див. Проміжний нижче).
Після того, як ви зробите декілька таких, ви можете перейти до виконання декількох проблем Project Euler . Вони сортуються за кількістю людей, які закінчили їх, що є досить хорошим показником складності. Вони перевіряють вашу логіку та Haskell більше, ніж попередні проблеми, але ви все одно зможете зробити перші кілька. Великою перевагою Haskell у цих проблемах є те, що цілі особи не обмежені в розмірі. Щоб виконати деякі з цих проблем, буде корисно прочитати глави 7 та 8, щоб дізнатись і про Haskell.
Новачок
Після цього у вас повинна бути досить хороша робота з рекурсією та функціями вищого порядку, тож вдало б почати робити ще деякі реальні проблеми у світі. Дуже хорошим місцем для початку є Real World Haskell (онлайн-книга, ви також можете придбати паперову копію). Я знайшов перші кілька глав, введених занадто швидко, для тих, хто ніколи раніше не робив функціональне програмування / не використовував рекурсії. Однак з практикою, яку ви мали б робити з попередніх проблем, ви повинні вважати її цілком зрозумілою.
Опрацювання проблем у книзі - це чудовий спосіб навчитися керувати абстракціями та будувати багаторазові компоненти в Haskell. Це важливо для людей, які використовуються для об'єктно-орієнтованого (oo) програмування, оскільки звичайні методи абстрагування oo (класи oo) не з'являються в Haskell (Haskell має типи класів, але вони сильно відрізняються від oo класів, більше схожі на oo інтерфейси ). Я не думаю, що пропускати глави не годиться, оскільки кожен представляє багато нових ідей, які використовуються в наступних главах.
Через деякий час ви перейдете до 14 глави, страшної глави монади (dum dum dummmm). Практично кожен, хто навчається Хаскеллу, має проблеми з розумінням монад, через те, наскільки поняття абстрактне. Я не можу придумати жодної концепції на іншій мові, яка є такою ж абстрактною, як монади у функціональному програмуванні. Monads дозволяє багато ідей (таких як операції вводу-виводу, обчислення, які можуть вийти з ладу, розбору, ...) бути об'єднані в одну ідею. Тому не відчувайте себе обезчереними, якщо після прочитання глави монад ви їх не дуже розумієте. Мені було корисно читати багато різних пояснень монад; кожен дає новий погляд на проблему. Ось дуже хороший список навчальних посібників з монади . Я настійно рекомендую все про монади , але інші також хороші.
Крім того, потрібно деякий час, щоб концепції справді занурилися. Це відбувається через використання, але також і через час. Я вважаю, що іноді сон на проблемі допомагає більше, ніж будь-що інше! Врешті-решт ідея натисне, і ви задумаєтесь, чому ви намагалися зрозуміти поняття, яке насправді неймовірно просте. Це дивовижно, коли це відбувається, і коли це відбувається, ви можете знайти Haskell улюбленою необхідною мовою програмування :)
Щоб переконатися, що ви прекрасно розумієте систему типу Haskell, вам слід спробувати вирішити 20 проміжних вправ haskell . Ці вправи, які використовують забавні назви таких функцій, як "пухнастий" та "банан", допомагають вам добре розуміти деякі основні концепції функціонального програмування, якщо ви їх ще не маєте. Хороший спосіб провести вечір за допомогою купки паперів, покритих стрілами, єдинорогів, сосисок та пухнастих бананів.
Проміжний
Після того, як ви зрозумієте Monads, я думаю, ви перейшли від початкового програміста Haskell до проміжного haskeller. То куди піти звідси? Перше, що я рекомендував би (якщо ви ще не навчилися їх вивчати монади) - це різні типи монад, такі як Reader, Writer та State. Знову ж таки, Реальний світ Хаскелл та Все про монади дає велике висвітлення цього. Щоб завершити навчання монаді, знання про трансформатори монади є обов'язковим. Вони дозволяють поєднувати різні типи Монад (наприклад, читацьку та державну монаду) в одну. Спочатку це може здатися марним, але, користуючись ними деякий час, ви будете замислюватися, як ви жили без них.
Тепер ви можете закінчити справжню книгу Haskell, якщо хочете. Пропуск глав зараз насправді не має значення, якщо у вас є монади погладити. Просто виберіть те, що вас цікавить.
Маючи знання, які ви мали б зараз, ви повинні мати можливість використовувати більшість пакунків на кабалі (добре документовані принаймні ...), а також більшість бібліотек, які постачаються з Haskell. Список цікавих бібліотек, які слід спробувати:
Парсек : для розбору програм та тексту. Набагато краще, ніж використання регулярних виразів. Відмінна документація, також має реальну главу Haskell.
QuickCheck : Дуже класна програма тестування. Що ви робите, - це написати присудок, який завжди повинен бути правдивим (наприклад length (reverse lst) == length lst
). Потім ви передаєте предикат QuickCheck, і він генерує безліч випадкових значень (у цьому випадку списків) і перевіряє, що предикат відповідає всім результатам. Дивіться також онлайн-посібник .
HUnit : Тестування блоку в Haskell.
gtk2hs : найпопулярніший фреймворк gui для Haskell, дозволяє писати gtk програми в Haskell.
happystack : Структура веб-розробки для Haskell. Не використовує бази даних, а зберігає тип даних. Досить хороші документи (інші популярні рамки будуть хапати і Йесод ).
Крім того, існує багато понять (як, наприклад, концепція Монади), яких слід з часом вивчити. Це буде простіше, ніж вперше вивчити Монади, оскільки ваш мозок буде звик працювати з рівнем абстракції. Дуже хороший огляд для вивчення цих концепцій високого рівня та того, як вони поєднуються разом, є Typeclassopedia .
Додаток: Інтерфейс, як Monads, але менш потужний. Кожна Монада є додатковою, але не навпаки. Це корисно, оскільки є деякі типи, які є застосовними, але не є Монадами. Також код, написаний за допомогою функцій Applicative, часто є більш компонованим, ніж написання еквівалентного коду за допомогою функцій Monad. Дивіться про функціонерів, прикладних функціонерів та моноїдів у посібнику, що вивчає вам haskell.
Складаний , Traversable : Класи типів , що абстрактні багато з операцій списків, так що одні і ті ж функції можуть бути застосовані до інших типів контейнерів. Дивіться також пояснення вікі haskell .
Моноїд : Моноїд - це тип, який має нульове (або порожнє) значення та операцію, позначену, <>
що з'єднує два моноїди разом, такі як x <> mempty = mempty <> x = x
і x <> (y <> z) = (x <> y) <> z
. Вони називаються законами тотожності та асоціативності. Багато типів - моноїди, такі як числа, з mempty = 0
і <> = +
. Це корисно у багатьох ситуаціях.
Стрілки : Стрілки - це спосіб представлення обчислень, які беруть вхід і повертають результат. Функція - це основний тип стрілки, але існує багато інших типів. Бібліотека також має багато дуже корисних функцій для маніпулювання стрілками - вони дуже корисні, навіть якщо їх застосовують лише для старих функцій Haskell.
Масиви : різні змінні / незмінні масиви в Haskell.
ST Monad : дозволяє писати код із змінним станом, який працює дуже швидко, залишаючись чистим поза монадою. Детальніше див. За посиланням.
FRP: функціональне реактивне програмування, новий, експериментальний спосіб написання коду, який обробляє події, тригери, входи та результати (наприклад, gui). Я не знаю багато про це, хоча. Розмова Пола Гудака про ямпа - це гарний початок.
Є багато нових мовних особливостей, на які слід звернути увагу. Я просто перерахую їх, ви можете знайти багато інформації про них з google, wikibook haskell , сайту haskellwiki.org та документації ghc .
- Класи багатопараметричних типів / функціональні залежності
- Тип сімей
- Екзистенційно кількісні типи
- Фантомні типи
- ГАДЦІ
- інші ...
Багато теорій Хаскелла базується на теорії категорій , тож ви можете розглянути це. Хорошим початковим пунктом є теорія категорії для вчених-комп'ютерів . Якщо ви не хочете купувати книгу, стаття , що стосується автора, також чудова.
Нарешті ви захочете дізнатися більше про різні інструменти Haskell. До них належать:
- ghc (та всі його особливості)
- кабал : система пакетів Haskell
- darcs : розподілена система контролю версій, написана в Haskell, дуже популярна для програм Haskell.
- пикша : автоматичний генератор документації Haskell
Під час вивчення всіх цих нових бібліотек та концепцій дуже корисно написати проект середнього розміру в Haskell. Це може бути будь-що (наприклад, невелика гра, аналізатор даних, веб-сайт, компілятор ). Робота над цим дозволить вам застосувати багато речей, які ви зараз вивчаєте. Ви залишаєтесь на цьому рівні на віки (саме тут я перебуваю).
Експерт
На цю стадію знадобляться роки (привіт з 2009 року!), Але звідси я здогадуюсь, що ти починаєш писати Phd документи, нові розширення ghc та придумуєш нові абстракції.
Отримання довідки
Нарешті, на будь-якому етапі навчання є багато місць для отримання інформації. Це:
- канал #haskell irc
- в списки розсилки . Вони варто підписатись лише для того, щоб прочитати дискусії, які відбуваються - деякі дуже цікаві.
- інші місця, перелічені на домашній сторінці haskell.org
Висновок
Ну це вийшло довше, ніж я очікував ... У будь-якому випадку, я думаю, що це дуже гарна ідея стати фахівцем в Haskell. Це займає багато часу, але це головним чином тому, що ви вчитеся абсолютно новому мисленню, роблячи це. Це не як навчання Ruby після вивчення Java, а як вивчення Java після вивчення C. Також я знаходжу, що мої навички об'єктно-орієнтованого програмування покращилися в результаті вивчення Haskell, оскільки я бачу багато нових способів абстрагування ідей.