40

我有一个 Haskell 模块,我希望它导出在其文件中声明的所有对象,除了一个特定的函数local_func

有没有比写一个明确列出所有其他声明的出口清单(并小心地让这个清单永远保持最新)更清洁的方法来实现这一点?

换句话说,我想要 , 的类似物import MyModule hiding (local_func),但在导出模块中指定,而不是在导入时指定。

4

2 回答 2

35

据我所知,目前没有办法做到这一点。

我通常最终做的是有一个中央模块,它重新导出重要的东西,作为一种方便的方式来导入所有必要的东西,而不是在定义这些东西的模块中隐藏任何东西(在某些情况下——你可能不会预见到! - 让您的用户更容易修改模块中的内容)。

为此,请使用以下语法:

-- |Convenient import module
module Foo.Import (module All) where

-- Import what you want to export
import Foo.Stuff as All hiding (local_func)
-- You can import several modules into the same namespace for this trick!
-- For example if using your module also requires 'decode' from "Data.Aeson" you can do
import Data.Aeson as All (decode)

您现在已经方便地导出了这些东西。

于 2013-06-21T18:25:36.937 回答
8

不幸的是没有。

可以想象一个小的句法添加,它可以实现你所要求的那种东西。现在可以写:

module M (module M) where

foo = quux

quux = 1+2

您可以显式导出整个模块。但是假设我们要添加语法,以便可以从该模块中隐藏。那么我们就可以这样写:

module M (module M hiding (quux)) where

foo = quux

quux = 1+2
于 2013-06-21T18:27:42.273 回答