我怀疑这取决于语言。关于函数式编程,我主要涉猎Haskell,所以我将解释它在那儿如何工作。
Haskell代码组织为“模块”,这些模块基本上只是功能和数据类型的集合。每个模块是一个文件。模块是Java类和Java包之间的混合体-模块作用的确切范围各不相同。模块还可以控制导出哪些函数和类型构造函数,以及隐藏哪些函数和类型构造函数。这是类似private
与public
Java中。
在我自己的程序中,我喜欢让模块在语义上做一件事;这使它们像Java类一样,只是它们可以定义多种数据类型。我在标准库中使用的模块(例如Data.List
)更像是软件包-它们提供了一组相似的实用程序功能。这也与静态Java类非常相似java.util.Arrays
。
这些模块也类似于Java包,因为它们可以嵌套以保持清晰(我认为这对代码本身没有任何影响)。通常,对于一个项目,我给它起一个名字(例如Project
),并将我所有的模块都包含在其中(例如Project.Parse
和Project.Run
)。如果我编写的代码更像一个库而不是一个应用程序,那么我将根据它的工作来组织它,例如Data.List
or Control.Monad
。与其他语言的主要区别在于,Haskell鼓励限制IO并将其全部放在一个位置。大量模块根本没有IO,对于任何给定项目,我都希望有尽可能多的纯模块。
例如,我正在使用一种称为TPL的简单编程语言(没有充分的理由)。为此,我创建了两个简单的模块:TPL.Parse
定义了语言的内部表示形式以及如何解析它,并且TPL.Run
运行了解释器并处理变量和IO。为了实际编译和运行代码,通常会有一个Main
模块,该模块最终成为程序的入口点。
在文件中组织功能有很大的自由度;这就是我喜欢做的。在其他地方使用数据类型之前,我先将它们定义为顶部。在定义了数据类型之后,我便实现了使它们成为其适当类型类的一部分所需的一切-有点像实现接口。然后,我将根据需要遵循逻辑和各种辅助函数。最后,我希望所有的IO功能都以开头main
。这样可以清楚地说明正在执行任何IO以及程序从何处开始。
因此,总而言之:函数包含在模块中,每个模块都由一个文件组成。几个模块可以组成一个程序或库。前者通常包括作为Main
其入口点的模块。在一个文件中,有不同的组织选项,但我更喜欢将数据类型分组在顶部附近,IO在底部附近以及逻辑在中间。
What's stopping you from...
多年以来用完全不同的思维方式进行编程,以至于Haskell代码在思维上没有计算能力。当然,您假设真实的项目总是正确,整洁地组织起来(也许是,但是像我这样的