1

我正在尝试使用黑线鳕为 github 库生成文档。这是我输入的代码:

$ find -name '*.hs' | xargs haddock --html -o docs
src/Reflex/Dom/Xhr.hs:154:0:
     error: missing binary operator before token "("
     #if MIN_VERSION_aeson(1,0,0)
     ^

然后我查看了我的源代码Xhr.hs第 154 行的相关部分:

import Data.Aeson
#if MIN_VERSION_aeson(1,0,0)
import Data.Aeson.Text
#else
import Data.Aeson.Encode
#endif

我不知道#if#else并且#endif是 Haskell 的一部分,但我能猜到意思。根据版本,代码应该导入Aeson.TextAeson.Encode。以防万一,我查了一下版本:

$ ghc-pkg list | grep aeson
    aeson-0.11.3.0

这足以给黑线鳕带来困难。信息页面被发送到一个名为的文件夹docs,其中包含一些等待填充Reflex.Dom库详细信息的空 html 文件。

4

1 回答 1

3

该代码使用-cpp. 预处理器指令不是通常的 Haskell 语言的一部分。为了正确解析该代码,您需要为 Haddock 指定其他选项

2.1。使用文字或预处理源

由于 Haddock 在内部使用 GHC,因此无需用户执行任何操作即可接受普通的和文字的 Haskell 源。但是,要使用 C 预处理器,用户必须-cpp使用--optghc. [强调我的]

但是,有两个问题。如果包被公开,您发布的 C 预处理器宏扩展仅适用于GHC 8.0(或更高版本) 。但是,无论 GHC 的版本如何,它都应该可以cabal haddock工作stack haddock。顺便说一句,如果您尝试构建 cabal/stack 包的文档,建议使用后一种变体。

如果您仍然知道自己在做什么,请使用haddock --optghc=-cpp.

于 2017-03-23T22:43:45.583 回答