【问题标题】:Unrecognised HLINT pragma in HaskellHaskell中无法识别的HLINT编译指示
【发布时间】:2021-01-15 19:18:04
【问题描述】:

我正在尝试禁用 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 #-}
  | ^^^

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

【问题讨论】:

    标签: haskell visual-studio-code haskell-stack hlint


    【解决方案1】:

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

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

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

    {- HLINT ignore -}
    

    我更喜欢常规的 cmets,因为它们不像 pragma 那样有奇怪的规则。其实the documentation注:

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

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

    【讨论】:

    • 啊哈...“在任何导入之后”。这是我最初尝试使用 ANN 编译指示时没有注意到的事情。我试图把它放在文件的开头,这导致了非常奇怪的解析错误。
    • 但你是对的。我很乐意改用 cmets。作为 Haskell 的新手,我现在真的不想为自己学习 pragma 带来负担。
    • @ReneSaarsoo:我认为作为初学者真正需要注意的唯一编译指示是LANGUAGE,它明确启用语言功能。您有时还会看到 OPTIONS_GHC 用于指定额外的编译器选项。你可以忽略其他人,直到你需要他们;它们控制更高级的优化、警告和类型系统功能。此外,pragma 名称不区分大小写,因此您可以编写例如{-# Language BlockArguments #-} 如果你愿意的话。
    猜你喜欢
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多