使用 Perl 的标准模块导出,您可以指定要按标签导出/导入的函数集。
所以,你可以有类似:all
or:private
或:test
or 之类的集合。
从历史上看,建议似乎是,如果您只想要一些半私有功能,那么有一个“内部”模块并重新导出它的“默认”部分。
我开始想要一个用于测试目的的半私有接口。那么,这仍然是这样做的方式,还是我在最近的 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
,它将由Foo
and导入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 版本运行代码,使得非导出函数在范围内。