Как структурировать приложение, написанное на функциональном языке?
Не иначе, как в любом другом приложении:
Каждый модуль скрывает секрет.
Проектное решение, которое может измениться, должно быть заключено в модуле.
Модуль может экспортировать один основной тип, пару вспомогательных типов и целый набор связанных операций.
Сплоченность и связь модулей по-прежнему так же важны, как Юдон и Константин сказали, что они были в 1970-х годах - хотя на функциональном языке вам редко приходится беспокоиться о «последовательных» формах сплоченности и связи.
Многие функциональные языки требуют одного модуля на файл, но диалекты ML предлагают гораздо большую гибкость. Однако подавляющая практика состоит в том, чтобы поместить модуль и его интерфейс в отдельные файлы. Цель Caml закрепляет это соглашение в их компиляторе.
Короче говоря, по-прежнему верно, что представление - это суть программирования (Фред Брукс), и, как и в любом другом крупном приложении, ваши модули должны быть организованы так, чтобы избежать демонстрации представления безвозмездно.
Единственное, что немного отличается в функциональном языке, это то, что вы можете предоставить модуль, который инкапсулирует некоторую схему исполнения , воплощенную в функции более высокого порядка. Например, я написал модуль на основе Bubble Search ; Мой код принимает любой жадный алгоритм и автоматически преобразует его в алгоритм поиска пузырей. Но такой модуль, который полностью посвящен коду и не имеет реальной структуры данных, встречается довольно редко.