【发布时间】:2016-04-20 20:01:16
【问题描述】:
我正在用 Haskell 编写一个模块,我想创建这个模块的两个版本:
- “基本”版本(名为 MyLib):用于速度和公开发布。
- 一个“扩展”的(名为 MyLibExt):供专家和私人使用。
为方便起见,我希望这两个模块(具有两个不同的名称)共享相同的源文件。这两个模块将具有相同的类型和相同的功能,但存在一些差异(“扩展”版本将依赖于“基本”版本)。
我的想法是有这样的东西:
module MyLib where -- for 'basic' version
module MyLibExt where -- for 'extended' version
MyType =
TypeA -- for 'basic' version
| TypeB -- for 'basic' version
| TypeC -- for 'basic' version
| TypeExtendedD -- for 'extended' version
| TypeExtendedE -- for 'extended' version
MyFunction TypeA = ... -- for 'basic' version
MyFunction TypeB = ... -- for 'basic' version
MyFunction TypeExtendedD = ... -- for 'extended' version
并使用为 GHC/Cabal 提供的一些编译指令构建这两个模块。
有没有可能用 Haskell 做这样的事情?
哪些 GHC/Cabal 编译指令可用于条件构建?
【问题讨论】:
-
我知道这很有用,但不认为有一个标准的方法来完成它。最好将
MyLib定义为代理模块,它只是重新导出MyLibExt的一些内容。这当然是许多现有图书馆的做法。 -
只需将所有内容放入扩展版本
MyLib.Internal,然后将其导入MyLib,但仅重新导出基本内容。这是一种很常见的模式。