1

我正在编写一个库,并在其中定义并导出了一些(非常复杂的)类型 synonym T

-- | A type
type T a b i o = ReaderT (WriterT i a X) (WriterT i b o)

在库内部,类型是有意义的。然而,对于用户来说,这是不必要的和令人困惑的。出于这个原因,我更愿意在 Haddock 页面中隐藏类型的实际声明。

IE,我希望黑线鳕页面看起来像这样......

type T a b i o
    A type

......而不是这个。

type T a b i o = ReaderT (WriterT i a X) (WriterT i b o)
    A type

这可能吗?如果是这样,怎么做?

4

1 回答 1

2

如果您的用户真的不需要知道引擎盖下的内容,您应该使用 anewtype而不是导出构造函数。GeneralizedNewtypeDeriving可以帮助缓解这种方法的痛苦。如果您的一些用户可能想偷看幕后,您可以newtype从基本模块中公开构造函数,但在主模块中隐藏它。一般来说,类型同义词是一个非常弱的抽象工具。该lens库使用它们取得了很好的效果,允许包定义镜头而不依赖于lens,但这有点奇怪。

我认为没有任何方法可以告诉 Haddock 隐藏类型同义词的含义。然而,这并不意味着你不能做你想做的事。

Cabal__HADDOCK_VERSION__在构建文档时定义了 CPP 宏。如果您愿意,可以检测到这一点并将类型同义词替换为newtype. 当然,这不会编译,但我认为它不会给 Haddock 带来任何麻烦。不过,我认为这根本不明智。

于 2016-05-10T21:20:37.187 回答