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