16

在许多 Haddock 生成的模块文档(例如Prelude)中,可以看到右上角的一个小框,其中包含可移植性、稳定性和维护者信息:

一个示例包信息框

从查看源代码到此类模块和实验,我确认此信息是从模块描述中的以下行生成的:

-- Maintainer  :  libraries@haskell.org
-- Stability   :  stable
-- Portability :  portable

这有几个奇怪的地方:

  • 这些字段似乎按此顺序工作——任何乱序的字段都被简单地视为模块描述本身的一部分。尽管源文件中的顺序与生成的文档中的顺序相反!

  • 我一直无法找到这些领域的任何官方文档。有一个名为的Cabal 包属性stability,其示例值与我在等效的 Haddock 字段中看到的值相匹配,但除此之外,我什么也没找到。

那么:这些字段打算如何使用,它们是否记录在任何地方?

特别是,我想知道:

  • Portability和的常用值的完整列表Stability这个 HaskellWiki 页面有一个列表,但我想知道这个列表的来源。

  • 决定模块是可移植还是不可移植的标准。特别是,我想要回答这些问题的包acme-strfry是一个 FFI 绑定,它是一个strfry仅在 glibc 中可用的函数。包是不可移植的,因为它只适用于 glibc 系统,还是可移植的,因为它不使用任何 Haskell 语言扩展?常见的用法似乎暗示后者。

  • 为什么源文件中需要特定的字段顺序,以及为什么它与生成的文档中的顺序相反。

4

2 回答 2

4

哦,我以为这些字段来自 cabal 包描述。Haddock 的文档中似乎根本没有记录它们。我发现了这个,它并没有真正回答你的问题,但是:

http://trac.haskell.org/haddock/ticket/71

因此,如果它无论如何都是自由格式的,为什么不直接写“不可移植(取决于 glibc)”呢?我什至看到过“便携式(取决于 ghc)”,这很奇怪。我还想知道在将 Foo 添加到 Haskell 2010 之后,由于非 Haskell98 扩展 Foo 而导致不可移植的模块会发生什么情况。

请注意,您链接到的 Cabal 文档也说稳定性是自由形式的。当然,即使 haddock 或 cabal 定义什么是可接受的值,仍然由维护者主观选择一个。

关于具体的顺序,你可能应该在黑线鳕邮件列表中询问,或者检查源并提交错误。

PS:strfry 是对 Haskell 社区的无价贡献,但它应该是纯粹的和可移植的,你不觉得吗?

于 2012-01-26T06:34:34.283 回答
3

啊,是的,黑线鳕最晦涩难懂的特征之一。

据我所知,这只是一个无证的黑客攻击。没有合理的理由说明字段的顺序很重要,但确实如此。格式的具体选择(即,作为模块注释中的一种特殊形式,而不是作为某种单独的块)也不是最好的。我的猜测是,有一天有人想快速添加这个功能,所以他们破解了一些最小但功能正常的东西,然后就这样了。(无需费心记录它。)

就个人而言,我根本不关心这些领域。这些信息可以从 Cabal 获得,所以我也懒得在 Haddock 中复制它。也许有一天,Cabal 会自动将这些信息传递给 Haddock……

于 2012-01-26T10:26:09.043 回答