Як почати писати на Хаскел: досвід Python-програміста


Дізнайтесь більше про нові кар'єрні можливості в EchoUA. Цікаві проекти, ринкова оплата, гарний колектив. Надсилайте резюме та приєднуйтеся до нас.

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

Спочатку – дані

Я думав про перехід від динамічної мови до статичної, а в Haskell-і структура даних, з якими ви працюєте, чітко описується при оголошенні. У Python у більшості випадків це завдання виконує код.

Коли я вперше побачив функції в Haskell, я задав собі питання: “Що є даними? Ця функція щось бере на вхід і видає щось на виході”? А при роботі з Python у мене в більшості виникало питання: “WHAT DOES THE CODE SAY”?

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

Читабельність коду

Python притягав мене можливістю писати дійсно читабельний код. Приклади коду ж на Haskell виглядали просто жахливо, за винятком деяких сніппетів, які, здавалося, були підібрані спеціально, щоб не злякати новачків. І хоча деякі шматки коду виглядали дуже навіть приємно, велика частина сорсів (sources) була наповнена чимось страшним. А за цим “страшним” якраз і ховалася вся потужність мови. 🙂

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

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

А потужніші абстракції в Haskell і зовсім нагадують деяку магію, якою я намагався уникати при роботі з Python.

Про читабельність я говорю серйозно

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

Коментарі. Вони займають верхній рядок в одній з глав нашої “книги”.

Ця глава описує те, як Томмі пішов в магазин і купив качку.

chapter :: Tommy -> Market -> Duck

Функції в загальній картині скорочують код по максимуму.

Стислість. Вам не знадобиться тонна коду для втілення ваших ідей.

Вставні символи

Я також хотів згадати про вставні функції, які поширені в мові Haskell. Вставні функції (чи оператори) – це ті функції, які використовують between для двох аргументів замість before. Простим прикладом є “+”.

У мові Haskell ми маємо декілька вставних символів, які використовуються за умовчанням: $, <$>, <-, ->, ін. Вони можуть вас трохи збентежити на початку шляху. Не переживайте! Як тільки ви навчитеся застосовувати їх, ви зрозумієте, як вони корисні і прості. Я нарахував близько 5 символів, які я використовую регулярно.

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

Треба повністю оновити знання

При вивченні Haskell ви стикатиметеся з новими термінами, наприклад, функтор чи монада.

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

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

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

Наприклад, функтор.

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

map (+1) [1,2,3,4] 
-- results in [2,3,4,5]

Так я дав назву цьому – мапа. Слово “мапа” є дуже простим для запам’ятовування. Список – це функтор. Список – це мапа.

Моя система перевірки помилок

Коли я писав на Python, моїм інструментом відладки були оператори друку. У Haskell я користуюся систематичними інструментами.

Але! Ви можете застосувати Debug.Trace. Цей прийом схожий з тим, як в Python функція друку не залежить від Haskell IO. І цей модуль може спочатку принести користь . Коли ви тільки починали працювати з Haskell, ви думали про те, як багато ви його використовуватимете?

Якщо ви не використовуватимете оператори трасування у вашому коді після перевірки помилок, то ви відразу помітите, що ваш код в Haskell виглядає гірше, ніж в Python.

Кращий підручник по монадах

Кожного разу, коли ви чуєте про успіх людини, що програмує на Haskell, ви замислюєтеся: “Як ця людина до кінця засвоїла монади”? Отже, все по порядку.

Я повинен провести синтаксичний аналіз. Я дещо знав про це, коли писав на Python. Але, в силу моєї недосвідченості в цій області, зараз зробити аналіз досить складно.

Окей, зараз я розповім детальніше. Я пояснюватиму на Хаскелі.

Я знайшов відео на YouTube “Parsing Stuff in Haskell“, у якому описувалося, як зробити JSON аналіз в Haskell, використовуючи при цьому бібліотеку Parsec.

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

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

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

Користь від ваших знань

Haskell є моєю основною мовою з кількох причин:

  1. Вибір технологій, якими я користуватимуся.
  2. Я можу писати свої програми швидше, і найчастіше ці програми я і продаю.
  3. Не доводиться мати справи з дрібними багами.
  4. Навіть стикаючись з декількома помилками, я швидко вирішую їх, оскільки вони більш-менш зрозумілі.
  5. Python не робив акцент на швидкості роботи. Хаскел робить те ж саме, але вибір все ж за мною.
  6. Рефакторинг, по суті, досить “вітряний”. У Python я іноді сильно сварив сам себе, коли забував правити невеликі помилки в коді, які пізніше створювали величезні проблеми.
  7. Чудові бібліотеки. Основна особливість Haskell полягає у високій якості бібліотек.
  8. Співтовариство, завжди готове допомогти.
  9. Простота масштабування коду до потрібного ядра.
  10. Haskell часто оновлюється. Минулого року, коли GHC (компілятор для Haskell) був оновлений до версії 7.8, роблячи при цьому написання коду в два рази зручніше, були прискорені багато веб-серверів.

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

З чого можна почати?

Я постарався і знайшов багато “відправних точок” для початку вашого знайомства з Haskell. Тут я продемонструю те, як би я починав, якби був не знайомий з Хаскел.

Спершу, прочитайте статтю “Learn you a Haskell for Great Good“.

Відмінно! Тепер виконаєте наступні пункти:

  1. Напишіть маленький модуль, при цьому не використовуючи IO. Щось типу судоку, в якому відбувається генерація пазлів. Використайте рандомні числа спершу. Використайте Debug. Використайте оператор друку, щоб бачити кожен ваш крок. Зробіть генерацію пазлів і Debug ‘а. Відправте все на екран. Створіть свій власний тип файлів і використайте функції.
  2. Закиньте все на сайт. Для цього використайте Scotty чи Spock. От і все, ваш URL готовий. Потім, URL, створюючий JSON у вашому пазлі.
  3. Повозіться з IO. Спробуйте написати пазл в терміналі, не користуючись Debug.Trace.
  4. Знаходьте нові варіанти. Змініть формат файлу для пазлу судоку і напишіть синтаксичний аналіз Parsec для нього! Не робіть формат JSON – спробуйте щось нове.

Удачі!

Оригінал: Mechanical Elephant

Київ, Харків, Одеса, Дніпро, Запоріжжя, Кривий Ріг, Вінниця, Херсон, Черкаси, Житомир, Хмельницький, Чернівці, Рівне, Івано-Франківськ, Кременчук, Тернопіль, Луцьк, Ужгород, Кам'янець-Подільський, Стрий - за статистикою саме з цих міст програмісти найбільше переїжджають працювати до Львова. А Ви розглядаєте relocate?


Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *