gpt4 book ai didi

haskell - Haddock 链接到非导入模块中的函数

转载 作者:行者123 更新时间:2023-12-04 15:00:02 24 4
gpt4 key购买 nike

在模块 B我有带有链接的文档 'A.foo' ,链接到 foo模块成员A .在模块 A我导入模块B . Haddock 将此呈现为指向 A.html#t:foo 的链接。 ,即指向类型foo (不存在)不是函数foo ,位于 A.html#v:foo .

  • 为什么黑线鳕链接到 t:对于以小写字母开头的变量?那是一个错误吗?对于 'A.Foo'我可以看到它可能是类型或构造函数,因此存在命名空间问题。对于 foo似乎一个变量至少是最合理的。
  • 有没有办法伪造链接?我在代码示例中编写此代码,因此我需要将其呈现为 foo .我尝试了 anchor ,但它们呈现为模块名称,并且对于直接超链接,您无法控制显示的文本。
  • 我考虑过一个后处理器(将 t:[a-z] 替换为 v: ),但这需要一个自定义的 Setup.hs,这会导致问题并且非常难看。
  • 我找不到任何 Haddock 命令行标志来获得更合理的行为,例如指定 foo是一个变量。
  • 我无法添加 A 的导入至B没有引入循环导入,这纯粹是为了文档而添加的。

  • 我在 Shake documentation 中遇到了这个问题, 例如 removeFilesAfter没有得到正确的链接。

    最佳答案

    我可以部分回答第一个问题(为什么?);不确定这是错误还是期望的行为。

    当黑线鳕解析 LexParseRn.rename 中的引用时,它会尝试在环境中查找标识符(通过 lookupGRE_RdrName )。这应该会失败。接下来它看起来是什么意思(使用 dataTcOccs from GHC’s RnEnv )。相关线路是:

    dataTcOccs :: RdrName -> [RdrName]
    -- Return both the given name and the same name promoted to the TcClsName
    -- namespace. This is useful when we aren't sure which we are looking at.
    dataTcOccs rdr_name
    [...]
    | isDataOcc occ || isVarOcc occ
    = [rdr_name, rdr_name_tc]
    [...]
    where
    occ = rdrNameOcc rdr_name
    rdr_name_tc = setRdrNameSpace rdr_name tcName

    因此它返回的名称首先被解释为之前的任何内容(可能是指向值的链接),然后被解释为类型构造函数。常规名称如何成为类型构造函数?我的猜测是,这是在 GHC 7.6 中对 TypeOperators 进行改革时添加的,现在它确实与值级运算符共享命名空间。

    然后 haddock 匹配结果:如果第一个是类型构造函数,则使用它,否则使用第二个。所以要么它之前是一个类型构造函数,然后它就被使用了。或者不是,而是 dataTcOccs生成的修改版是要使用的。

    在我看来,黑线鳕应该总是在这里使用第一个选项,而代码只是一个误导性的副本,从实际上可以解决多个结果时如何使用它们。

    关于haskell - Haddock 链接到非导入模块中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17912567/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com