如何在函数式语言中构建应用程序?与任何其他类型的应用程序没有什么不同:- 每个模块都隐藏着一个秘密。 - 可能会发生变化的设计决策应该封装在一个模块中。 - 一个模块可能导出一个主要类型、一些辅助类型和一堆相关操作。 - 模块内聚性和耦合性仍然像 Yourdon 和 Constantine 在上世纪70年代所说的那样重要,尽管在函数式语言中你很少需要担心“顺序”形式的内聚性和耦合性。 - 许多函数式语言要求每个文件有一个模块,但是 ML 方言提供了更大的灵活性。然而,压倒性的做法是将一个模块及其接口放入单独的文件中。Objective Caml 将这种约定奉为圭臬。简而言之,仍然正确的是“表达是编程的本质”(Fred Brooks),并且与任何其他大型应用程序一样,您的模块应该组织起来,以避免无谓地暴露表示。在函数式编程语言中,有一件略微不同的事情是,你可能会提供一个模块来封装某种执行模式,这种模式体现在高阶函数中。例如,我写了一个基于冒泡排序的模块;我的代码可以将任何贪心算法自动转换为冒泡搜索算法。但像这样完全关于代码且没有真正数据结构的模块是非常罕见的。