使用Perl的standard module exports,您可以指定要按标签导出/导入的函数集。
因此,您可以拥有:all
或:private
或:test
等设置。
从历史上看,建议似乎是如果你只想要一些半私有函数,那么就有一个“内部”模块并重新导出它的“默认”部分。
我开始想要一个用于测试目的的半私有接口。那么,这仍然是这样做的方式,还是我在最近的ghc中遗漏了什么?
答案 0 :(得分:4)
不,在Haskell中不可能。
Haskell解决这个问题的方法就是拥有单独的模块。 E.g。
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
依次导入Foo.Private
,那么您将要么使用
递归模块,或将实际定义移动到第三个模块,
说Foo.Base
,由Foo
和Foo.Private
导入。
此外,与perl不同,ghc不支持在同一个模块中定义多个模块 文件yet,这使得这个解决方案有点重量级。
答案 1 :(得分:2)
您可以使用以下方法导入函数子集:
import Data.List (nub, sort)
这只会从Data.List模块中导入nub
和sort
。比如,如果您不想要导入某些内容,那么:
import Data.List hiding (sort)
这将导入除sort函数之外的Data.List模块中的所有函数。
如果您只想从模块中导出某些函数,请按以下方式定义它们:
module Data.List
( sort,
nub
) where
这只会导出模块中的sort
和nub
函数。
答案 2 :(得分:0)
the haskell version of doctest运行代码,使得未导出的函数在范围内。