使用 Perl 的标准模块导出,您可以指定要按标签导出/导入的函数集。
所以,你可以有类似:allor:private或:testor 之类的集合。
从历史上看,建议似乎是,如果您只想要一些半私有功能,那么有一个“内部”模块并重新导出它的“默认”部分。
我开始想要一个用于测试目的的半私有接口。那么,这仍然是这样做的方式,还是我在最近的 ghc 中遗漏了一些东西?
不,这在 Haskell 中是不可能的。
Haskell 解决这个问题的方法就是拥有单独的模块。例如
module Foo.Private
  ( private1
  , private2
  , private3
  ) where
...
module Foo
  ( public1
  , public2
  , public3
  ) where
...
此外,如果您想从以下Foo.Private位置重新导出所有内容Foo:
module Foo.Private
  ( module Foo
  , private1
  , private2
  , private3
  ) where
import Foo
...
但是如果Foo反过来 import Foo.Private,那么您将不得不使用递归模块,或者将实际定义移动到第三个模块,例如Foo.Base,它将由Fooand导入Foo.Private。
此外,与 perl 不同的是,ghc 还不支持在同一个文件中定义多个模块,这使得该解决方案有些重量级。
您可以使用以下方法导入函数子集:
import Data.List (nub, sort)
这只会从 Data.List 模块导入nub和导入。sort说,如果您不想导入某些东西,那么:
import Data.List hiding (sort)
这将导入 Data.List 模块中除排序功能之外的所有功能。
如果您只想从模块中导出某些功能,请像这样定义它们:
module Data.List
    ( sort,
      nub
    ) where
那只会导出模块中的sort和nub函数。
doctest 的 haskell 版本运行代码,使得非导出函数在范围内。