haskell中任何子集模块导入系统?

时间:2013-10-08 19:55:56

标签: perl haskell

使用Perl的standard module exports,您可以指定要按标签导出/导入的函数集。

因此,您可以拥有:all:private:test等设置。

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

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

3 个答案:

答案 0 :(得分:4)

不,在Haskell中不可能。

Haskell解决这个问题的方法就是拥有单独的模块。 E.g。

module Foo.Private
  ( private1
  , private2
  , private3
  ) where

...

module Foo
  ( public1
  , public2
  , public3
  ) where

...

此外,如果您希望Foo.PrivateFoo重新导出所有内容:

module Foo.Private
  ( module Foo
  , private1
  , private2
  , private3
  ) where

import Foo

...

但如果Foo依次导入Foo.Private,那么您将要么使用 递归模块,或将实际定义移动到第三个模块, 说Foo.Base,由FooFoo.Private导入。

此外,与perl不同,ghc不支持在同一个模块中定义多个模块 文件yet,这使得这个解决方案有点重量级。

答案 1 :(得分:2)

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

import Data.List (nub, sort)

这只会从Data.List模块中导入nubsort。比如,如果您不想要导入某些内容,那么:

import Data.List hiding (sort)

这将导入除sort函数之外的Data.List模块中的所有函数。

如果您只想从模块中导出某些函数,请按以下方式定义它们:

module Data.List
    ( sort,
      nub
    ) where

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

答案 2 :(得分:0)

the haskell version of doctest运行代码,使得未导出的函数在范围内。