Функціональні схеми дизайну [закрито]


106

Існує багато функціональних ідіом: монади, програми, стрілки тощо. Вони задокументовані в різних статтях, але, на жаль, я не знаю жодної книги чи статті, де вони зведені в одному місці (є Typeclassopedia, але в ньому багато областей, які недостатньо покриті). Чи може хтось порекомендувати статтю / книгу, яка добре висвітлює їх в одному місці та яка може бути доступною програмісту з проміжними навичками роботи з ПП?


Це не відповідає безпосередньо на ваше запитання, але в цьому іншому запитанні є цікава інформація (і принаймні посилання-два): stackoverflow.com/questions/327955/…
reuben

15
Чи можете ви розширити, на які сфери, на вашу думку, Typeclassopedia недостатньо охоплює?
dave4420

2
@ dave4420 Якщо я читаю typeclassopedia від початку до кінця, чим більше я читаю, тим менше розумію. Перші розділи дійсно хороші, але останні розділи для мене важко читаються.
Костянтин Соломатов

3
@KonstantinSolomatov, можливо, вам потрібно буде вивчити розділи, які ви не розумієте, переглядати дописи в блозі та пильно дивитися на код. всі ці "дизайнерські зразки" в машинокласопедії - це справді абстракції, і часто глибокі, які часом потребують певного часу.
jberryman

1
@DanBurton не впевнений, чи ви неправильно прочитали мій коментар, але я б класифікував все це як глибокі абстракції, хоча легко забути, що коли у вас був "А-а-а-а-а!" мить.
jberryman

Відповіді:


35

Моя пропозиція - якщо ви хочете навчитися Скалі, прочитати книгу від Пола Кьюсано та Рунара Б'ярнасона:

http://manning.com/bjarnason/

Частина II: Бібліотеки функціонального дизайну та комбінаторів

  1. Створення маленьких мов
  2. JSON серіалізація
  3. Тестування на основі специфікацій
  4. Парсери
  5. Чисто функціональний паралелізм
  6. Чисто функціональний стан

Частина III: Функціональні схеми дизайну

  1. Справа абстракції
  2. Моноїди
  3. Функціонери
  4. Монади
  5. Прикладні функтори
  6. Перехідні та складні структури даних
  7. Комонади

Частина IV: Порушення правил: ефекти та введення / виведення

  1. Ефекти проти побічних ефектів
  2. Потокова обробка та додаткове введення-виведення
  3. Забезпечення визначення масштабів ефектів за допомогою системи типів

31

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

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

У реальному світі Haskell є кілька глав про монадах. У Розділі 14. Монади автори пояснюють основи та деякі загальні звичаї (можливо, перелік, стан). Глава 15. Програмування за допомогою монад дає більше пояснень щодо їх ефективного використання (воно охоплює також монаду читача). Наступний розділ пояснює, як користуватися Парсеком , але може бути цікавіше шукати статті, що висвітлюють, як це насправді працює: це має бути справді хорошим прикладом добре організованого використання монад для розбору. Фіанлі, глава 18. Трансформатори Монадипредставляє, як працюють монадні трансформатори, а потім показує, як побудувати їх крок за кроком. Цікавими є також міркування щодо заключних розділів глави.

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


Що стосується моделей OOP групи з чотирьох, є приємний набір 3-х статей IBM про цю тему в їхній серії Функціональне мислення . Цільовою функціональною мовою є Scala. Вони продовжують, пояснюючи звичні шаблони дизайну в OOP та показують, як вони відображають у Scala.

  1. Функціональне мислення: Функціональні схеми дизайну, Частина 1 . Тут вони охоплюють фабрики, шаблонні методи, стратегію, легку вагу. Суть полягає в тому, що, маючи функції як значення першого класу, все набагато простіше.
  2. Функціональне мислення: Функціональні схеми дизайну, Частина 2 . Йдеться про java та groovy . Він стосується схеми адаптера.
  3. Функціональне мислення: Функціональні схеми дизайну, Частина 3 . Тут вони говорять про схему перекладача. Знову ж таки цільова мова - рихла.

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


Дякую, але я маю на увазі різні типи шаблонів, як, наприклад, монада, стрілка, застосовні без GoF.
Костянтин Соломатов

@KonstantinSolomatov: Я неправильно зрозумів ваше запитання, вибачте. Я додав кілька посилань на монадів і стріл.
Ріккардо Т.

18

Джеремі Гіббонс має блог "Шаблони" на FP, якому судилося з часом стати значною мірою книгою, про яку ви просите. Звичайно, це ще не в такому стані, щоб бути настільки корисним, як ви могли б хотіти просто зараз, але він заслуговує на деяке заохочення!

Тим часом я скажу +1 для Typeclassopedia Брента Йоргей. Це дійсно корисно, і якщо є пізніші частини, які плутають, цей сайт є хорошим місцем, щоб дістатись до них. Я знаю, що Brent перевіряє це. Якщо він не звертається до своїх читачів, дайте йому допомогу.



5

Чи читали ви пізніші глави « Навчитись вам хаскелом для великого добра» ?

  • Розділ 6 охоплює карти та складки, які є двома важливішими "моделями дизайну" у функціональних мовах.

  • Розділи 11-13 охоплюють функціонери, додаткові функціонери та монади у такому порядку. Це корисно - у багатьох навчальних посібниках вводяться Functors, а потім Monads, а потім торкніться додатків Functors в кінці (якщо вони взагалі висвітлюють це). Порядок в LYAH кращий, тому що, переходячи від Functors => Applicative Functors => Monads рухає вас поступово вгору по сходах загальності та потужності.

  • Розділ 14 охоплює Zippers - ви можете ефективно вважати це класами контейнерів із вказівником на певний фрагмент даних, що означає, що ви отримуєте O (1) доступ та оновлення у місці вказівника.

Він не охоплює Стрілки або Комонади, які є більш розвиненою темою в Haskell. Щоб зрозуміти, як і навіщо використовувати стрілки або комонади, ви обов'язково повинні вже чітко зрозуміти Monads, тому я не думаю, що це проблема - LYAH твердо спрямований на початковий кінець ринку Haskell.


1
Так, я читав книгу. Мені це дуже сподобалось. На жаль, він не приховує стрілки та багато інших сучасних моделей. Я також хочу прочитати більше про Monads та Applicatives (наприклад, LYHGG не охоплює монаду продовження).
Костянтин Соломатов
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.