Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

Прогризання в Хаскель

with 6 comments

Потрохи, дуже й дуже повільно гризу граніт науки з Хаскелем. Читаю “Вивчить собі Хаскела на велике щастя!“.

Книжка складна (чи то Хаскель такий), але гумор іноді веселий:

Шукати елемент у порожньому списку теж не варто, бо його там немає (і не тільки його — там немає багатьох інших елементів!)

Дійшов до розділу 8 про написання власних типів і типокласів. Ледве розібрався. Цікаво що в типів та конструкторів типів є типи (кшталти, kinds), і це не типи, як в Python, а щось інше. Не зрозуміло чому типоклас Функтор такий важливий. Ну можна виконувати над ним map. Але напевне важливий, бо десь я бачив слова “Аплікативний функтор, моноїд”, значить то десь до монад не далеко. Але дуже тішусь тим що наступний розділ буде про ввід-вивід, і я НАРЕШТІ зможу написати “Привіт, світе!”. 🙂 Ну тобто ясно що main = putStr "Привіт, світе!", але зрозуміти що повертає putStr.

P.S. Я трохи намагався розібратись з монадами, і здається мені що в хаскелі функції не виконують побічні ефекти, але повертають щось що каже що повинні бути виконані певні побічні ефекти. Як те щось називається, і хто виконує – ще не знаю. Знаю лише що монада це три речі – тип, функція return, і ще якась функція. Що вони роблять – теж поки що не зрозуміло.

А потім може постараюсь пройти Write Yourself a Scheme in 48 Hours.

Advertisements

Written by bunyk

Вересень 20, 2014 at 12:41

Оприлюднено в Кодерство, Нещоденник

Tagged with

Відповідей: 6

Subscribe to comments with RSS.

  1. Функтор такий важливий тому, що це фундаментальна штука, з якої походить підклас аплікативних функторів, з яких походить підклас монад.

    Функтор дозволяє компонувати функції, які були в нього підняті (lifted), оскільки закони функтора (fmap id === id, fmap f . fmap g === fmap (f . g) ) гарантують, що відображення чистих функцій у функтор буде несуперечливим і зберігатиме їхні властивості (чорт, аж жалію, що не знаю теорії категорій, там ці слова якось правильніше виражаються). Це закладає основу для застосування чистих функцій всередині монад (оскільки кожна монада — це функтор). Ну і функтором є досить багато речей.

    «Тип» типа не може бути тим же самим типом тому, що тоді логічне числення, яке відображає програма, починає потерпати від парадоксів наївної теорії множин. Саме тому Хаскель обмежується «триповерховим» рівнем абстракції: значення — типи — сорти-kinds, не йдучи далі. Коли з’являються залежні типи (те, чого досі немає в Хаскелі з практичних міркувань, але є в Coq/Agda/Idris), то кількість «поверхів» уже не обмежується, але «поверхи» типізації не можуть перемішуватись, кожний «поверх» стає «всесвітом», який типізується наступним «всесвітом».

    Так, монади в хаскелі не виконують побічних ефектів, монадний код є композицією чистих функцій, — але монади розмічають межі, на яких можуть відбуватись ефекти, не псуючи чистоту функцій всередині. Тому казати, що чиста функція в монаді це брудна функція, неправильно (монади це ніби піна, що оточує порожнечу чистих функцій).

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

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

    А з практичного боку раджу терпляче порозписувати руками всякі вирази із кучею >>= та do-нотацію. Нічого екстраординарно складного там немає, але це попервах досить клопітка математична вправа на перетворення виразів і перевірку коректності перетворення за допомогою типів. ПІсля певного тренування такі вирази стають достатньо інтуїтивними.

    dmytrish

    Вересень 20, 2014 at 13:15

  2. десь в цьому місці тобі потрібно облишити ненадовго книгу і прочитати типокласопедію. Це хороший шматок добра

    http://www.haskell.org/haskellwiki/Typeclassopedia

    danbst

    Вересень 20, 2014 at 13:17

    • Дякую, матиму що почитати холодними осінніми вечорами. 🙂

      bunyk

      Вересень 20, 2014 at 14:01


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

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: