单片Haskell项目与将它们划分为更小的程序

单片Haskell项目与将它们划分为更小的程序,haskell,Haskell,Neil Mitchell在其第33页中主张将Haskell项目捆绑到具有多种模式的单个可执行文件中。(仅供参考Neil Mitchell的CmdArgs库使此操作变得简单。)因此,可能有一种模式启动web服务器,另一种模式从命令行查询数据库,等等。引用: 提供一个可执行文件 版本3有四个可执行程序——一个用于生成排名 信息,一个做命令行搜索,一个做web 搜索,一个做回归测试。版本4有一个 可执行文件,可执行上述所有和更多操作,由FLAGS控制。 只提供一个终端程序有很多好处——it 减少了代

Neil Mitchell在其第33页中主张将Haskell项目捆绑到具有多种模式的单个可执行文件中。(仅供参考Neil Mitchell的CmdArgs库使此操作变得简单。)因此,可能有一种模式启动web服务器,另一种模式从命令行查询数据库,等等。引用:

提供一个可执行文件

版本3有四个可执行程序——一个用于生成排名 信息,一个做命令行搜索,一个做web 搜索,一个做回归测试。版本4有一个 可执行文件,可执行上述所有和更多操作,由FLAGS控制。 只提供一个终端程序有很多好处——it 减少了代码在没有注意到的情况下被破坏的可能性,这使得 通过不复制Haskell运行时系统,总文件大小更小, 它减少了用户需要学习的命令数量。迁移到 一个多用途的可执行文件似乎是一个共同的主题,它是什么工具 例如DARC和hpc都基于一个命令和多个命令 模式。�

我的问题:在Haskell中,将所有内容放在一个更大的单片可执行文件中,而不是(比如)遵循“Unix哲学”,构建通过数据库或文本流进行通信的小型、独立、互操作的Haskell程序,这是否被普遍认为是一种最佳实践


我可以看到一个大型单片Haskell程序如何通过在整个系统中共享核心数据类型来更好地利用类型安全性。但针对大型巨石的标准警告似乎仍然适用,包括依赖冲突的风险增加

通过指向可执行文件的符号链接,以及检查ARGV[0]的行为,您可以在一定程度上充分利用这两个方面

如果没有必要或无意单独升级这些工具,那么我认为将它们放在一个程序中是最好的方法。我认为,如果这些工具是密切相关的,就像您在示例中提到的那样,这是适用的

这并不违背unix的理念,
ls
有一系列选项可以改变它的行为,理论上可以将其放入单独的程序中。但它们共享列出目录内容的共同功能,因此都在同一个可执行文件中


但是,如果这些功能基本上是独立的(即
ls
cat
),并且可以合理地单独升级,那么将它们放在单独的可执行文件中可能是合适的。

通常有许多Unix工具通过子命令提供复杂的功能,我认为他们的数量最近一直在增长

我的第一个例子是unixshell。有几个内置命令,不同的shell在不同的命令集中生成,而其他命令则作为二进制文件实现

另一个典型的Unix示例是vi编辑器。许多实现提供只读文件查看器(view)和基于命令的编辑器(ex)的功能,具体取决于调用二进制文件的名称。二进制文件以几个名称链接到文件系统,以便同一个二进制文件提供所有工具

作为一个更现代的例子,git版本控制包的实现方式与我在vi中描述的方式类似,尽管它有一小部分二进制文件,这些二进制文件在文件系统中链接为一组更大的名称,而不仅仅是一个二进制文件。此外,您可以通过单个文件名调用功能,例如
git status
git diff
,或者您可以通过主
git
二进制文件使用多级命令,例如
git status
git diff


因此,我建议,即使在Unix世界,这也是一种公认的做法,已经有相当一段时间了,您也不应该因为与Unix理念的冲突而放弃这一建议。

您仍然可以通过将所有内容构建为库并具有多个主模块来获得安全好处,阴谋集团甚至可以很容易地单独建造它们。为什么不能两者都建造呢?将应用程序构建为一系列小型的单模式可执行文件,然后创建一个多模式可执行文件来调用每个单模式可执行文件。这样,您就可以使用Unix的原理,即小型的、可组合的工具,如果您愿意,这些工具都可以通过单个接口使用。不幸的是,这意味着您失去了类型检查的一些好处,并在每个可执行文件中复制了运行时,但您获得了两个世界的最佳可用性。仅供参考,它比cmdargs领先几英里。