Haskell 中无法识别的 HLINT 编译指示

问题描述

我正在尝试禁用 HLint 给我的一些警告。 According to docs 我应该能够在我的文件顶部添加一个编译指示。所以我尝试了以下方法

{-# HLINT ignore #-}
module Main where

但是在运行 stack build 时出现错误

/Users/nene/somedir/src/Main.hs:1:1: warning: [-Wunrecognised-pragmas]
    Unrecognised pragma
  |
1 | {-# HLINT ignore #-}
  | ^^^

似乎 pragma 实际上在我的编辑器(带有“Haskell”扩展名的 VSCode)中有效,但在运行 stack 时无法识别。

解决方法

如果你想在没有任何警告的情况下使用编译指示,你可以像这样使用 ANN 编译指示:

{-# ANN module "HLint: ignore" #-}

但是我建议使用常规注释而不是编译指示:

{- HLINT ignore -}

我更喜欢常规注释,因为它们没有像 pragma 那样奇怪的规则。事实上,the documentation 注意:

对于 ANN 编译指示,将它们放在任何导入语句之后很重要。如果您启用了 OverloadedStrings 扩展,则需要为注释提供显式类型,例如{-# ANN myFunction ("HLint: ignore" :: String) #-}ANN 编译指示还可以增加编译时间或导致比其他要求更多的重新编译,因为它们由 TemplateHaskell 评估。

对于 {-# HLINT #-} 编译指示,GHC 可能会发出有关无法识别编译指示的警告,可以使用 -Wno-unrecognised-pragmas 进行抑制。