Что такое хороший способ разработки/структурирования больших функциональных программ, особенно в Haskell?
Я прошел через кучу учебников (напишите сами, как моя любимая, с Real World Haskell - вторая секунда), но большинство программ относительно невелики и одноцелевые. Кроме того, я не считаю, что некоторые из них особенно элегантны (например, обширные таблицы поиска в WYAS).
Теперь я хочу писать более крупные программы с более движущимися частями - получать данные из разных источников, чистить их, обрабатывать их различными способами, отображать его в пользовательских интерфейсах, сохранять его, общаться по сетям и т.д. Как можно лучше структурировать такой код, чтобы он был разборчивым, поддерживаемым и адаптированным к изменяющимся требованиям?
Существует довольно большая литература, посвященная этим вопросам для крупных объектно-ориентированных императивных программ. Идеи, такие как MVC, шаблоны проектирования и т.д., Являются достойными рецептами для реализации широких целей, таких как разделение проблем и повторное использование в стиле OO. Кроме того, новые императивные языки поддаются "реставрационному дизайну", в котором, по моему новаторскому мнению, Haskell кажется менее подходящим.
Есть ли эквивалентная литература для Haskell? Как лучше всего использовать зоопарк экзотических структур управления в функциональном программировании (монады, стрелки, аппликативные и т.д.)? Какие рекомендации вы можете порекомендовать?
Спасибо!
EDIT (это продолжение ответа Дона Стюарта):
@dons упоминается: "Монады захватывают ключевые архитектурные проекты в типах".
Я думаю, мой вопрос: как следует думать о ключевых архитектурных проектах на чистом функциональном языке?
Рассмотрим пример нескольких потоков данных и нескольких этапов обработки. Я могу писать модульные парсеры для потоков данных в набор структур данных, и я могу реализовать каждый шаг обработки как чистую функцию. Шаги обработки, требуемые для одного фрагмента данных, будут зависеть от его значения и других. Некоторые из этих шагов должны сопровождаться побочными эффектами, такими как обновления графического интерфейса пользователя или запросы к базе данных.
Каков "правильный" способ связать данные и шаги анализа красивым способом? Можно написать большую функцию, которая делает правильные вещи для разных типов данных. Или можно использовать монаду, чтобы следить за тем, что было обработано до сих пор, и каждый шаг обработки получает все, что ему нужно, от состояния монады. Или можно писать в основном отдельные программы и отправлять сообщения (мне не нравится этот вариант).
Слайды, с которыми он связан, имеют Вещь, в которой нам нужна пуля: "Идиомы для картирования дизайна на типы/функции/классы/монады ". Каковы идиомы?:)