在黑线鳕中隐藏类型同义词的声明

Hiding declaration of type synonym in Haddock

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

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

在图书馆内部,该类型很有意义。然而,对于用户来说,这是不必要的和令人困惑的。因此,我宁愿隐藏 Haddock 页面中类型的实际声明。

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

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

这可能吗?如果可以,怎么做?

如果您的用户真的不需要知道底层是什么,您应该使用 newtype 而不是导出构造函数。 GeneralizedNewtypeDeriving 可以帮助减轻这种方法的痛苦。如果您的某些用户可能想窥探幕后情况,您可以从基本模块中公开 newtype 构造函数,但将其隐藏在主模块中。一般来说,类型同义词是一个非常弱的抽象工具。 lens 库使用它们取得了很好的效果,允许包定义镜头而不依赖于 lens,但这有点奇怪。

我认为没有任何方法可以告诉 Haddock 隐藏类型同义词的含义。但是,这并不意味着您不能为所欲为。

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