4

使用 Perl 的标准模块导出,您可以指定要按标签导出/导入的函数集。

所以,你可以有类似:allor:private:testor 之类的集合。

从历史上看,建议似乎是,如果您只想要一些半私有功能,那么有一个“内部”模块并重新导出它的“默认”部分。

我开始想要一个用于测试目的的半私有接口。那么,这仍然是这样做的方式,还是我在最近的 ghc 中遗漏了一些东西?

4

3 回答 3

4

不,这在 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 还不支持在同一个文件中定义多个模块这使得该解决方案有些重量级。

于 2013-10-09T08:21:11.673 回答
2

您可以使用以下方法导入函数子集:

import Data.List (nub, sort)

这只会从 Data.List 模块导入nub和导入。sort说,如果您不想导入某些东西,那么:

import Data.List hiding (sort)

这将导入 Data.List 模块中除排序功能之外的所有功能。

如果您只想从模块中导出某些功能,请像这样定义它们:

module Data.List
    ( sort,
      nub
    ) where

那只会导出模块中的sortnub函数。

于 2013-10-08T20:03:04.517 回答
0

doctest 的 haskell 版本运行代码,使得非导出函数在范围内。

于 2013-10-08T20:48:52.440 回答