Який хороший спосіб розробити / структурувати великі функціональні програми, особливо в Haskell?
Я пройшов безліч навчальних посібників (Напишіть собі схему, яка є моїм улюбленим, з Real World Haskell близько секунди) - але більшість програм відносно невеликі та цільові. Крім того, я не вважаю деякі з них особливо витонченими (наприклад, великі таблиці пошуку в WYAS).
Зараз я хочу писати більші програми, з більш рухомими частинами - отримання даних з найрізноманітніших джерел, очищення, обробка їх різними способами, відображення їх у користувальницьких інтерфейсах, зберігання, спілкування через мережі тощо. одна найкраща структура такого коду, щоб він був розбірливим, підтримуваним та пристосованим до змін, що змінюються?
Існує досить велика література, що стосується цих питань для великих об'єктно-орієнтованих імперативних програм. Ідеї, такі як MVC, модель дизайну тощо, є пристойними рецептами для реалізації широких цілей, таких як розділення проблем та повторне використання в стилі OO. Крім того, нові імперативні мови піддаються стилю рефакторингу «дизайн у міру зростання», до якого, на мою думку початківця, Haskell виглядає менш підходящим.
Чи існує еквівалентна література для Haskell? Як зоопарк екзотичних структур управління доступний у функціональному програмуванні (монади, стрілки, додаткові програми тощо) найкраще використовуються для цієї мети? Які найкращі практики ви могли б порекомендувати?
Дякую!
EDIT (це відповідь на відповідь Дон Стюарт):
@dons згадується: "Монади захоплюють ключові архітектурні конструкції за типами."
Я думаю, моє запитання: як слід думати про ключові архітектурні конструкції чистою функціональною мовою?
Розглянемо на прикладі декількох потоків даних та декількох етапів обробки. Я можу записати модульні аналізатори для потоків даних до набору структур даних і можу реалізувати кожен етап обробки як чисту функцію. Етапи обробки, необхідні для однієї частини даних, залежатимуть від її значення та інших ". Деяким крокам слід дотримуватися побічних ефектів, таких як оновлення GUI або запити до бази даних.
Який "правильний" спосіб прив'язувати дані та кроки аналізу симпатичним чином? Можна було б написати велику функцію, яка робить правильно для різних типів даних. Або можна використати монаду, щоб відслідковувати те, що було оброблено до цього часу, і кожен етап обробки отримує все необхідне, наступне від стану монади. Або можна написати значною мірою окремі програми та надсилати повідомлення (мені ця опція не дуже подобається).
На слайдах, які він зв'язав, є куля «Нам потрібні речі»: «Ідіоми для відображення дизайну на типи / функції / класи / монади». Що таке ідіоми? :)