【问题标题】:Haskell: how to tell hlint not to: `Warning: Use string literal`Haskell:如何告诉 hlint 不要:`警告:使用字符串文字`
【发布时间】:2013-10-08 01:43:25
【问题描述】:

我有一个单元测试文件:

module X04PatMatTest where

import AssertError
import Test.HUnit
import X04PatMat

...

然后 hlint 抱怨:

X04PatMatTest.hs:15:69: Warning: Use string literal 
Found:
  ['a', 'b', 'd']
Why not:
  "abd"

由于种种原因,我很想把['a', 'b', 'd']放在测试代码中。

我尝试了各种排列方式

{-# ANN X04PatMatTest "HLint: ignore Warning: Use string literal" #-}

就像将编译指示作为文件的第一行,在模块声明之后,名称为module 而不是X04...,将Warning 更改为warn ...

什么是魔法?

【问题讨论】:

    标签: haskell hlint


    【解决方案1】:

    您需要以另一种方式编写编译指示。经过反复试验,我得出以下结论:

    module Test where
    
    import Data.Char(toUpper)
    
    {-# ANN module "HLint: ignore Use string literal" #-}
    main :: IO ()
    main = putStrLn ['a','b','c']
    

    请注意,您必须写 "module" 而不是模块的名称

    【讨论】:

    • 这行得通 - 谢谢。 HLint 文档对此并不清楚。对于函数的编译指示,它说:{-# ANN myFunction "HLint: ignore" #-}。对于模块上的编译指示,它说:{-# ANN module "HLint: ignore Eta reduce" #-} 所以我不清楚我是否应该写module 或类似myModule 的东西。
    • @haroldcarr 没有明确说明,没错。您可以以某种方式从以下事实中得出它:第一个字母是小写字母,模块名称以大写字母开头。附:如果您能接受我的回答,那就太好了。
    • 我已将文档更新为:{-# ANN module "HLint: ignore Eta reduce" #-} - 忽略此模块中的所有 eta 减少建议(使用 module 字面意思,而不是模块的名称)。它们在 git 中,但文档链接仍会将您带到过时的 darcs。我提出了一个错误来解决这个问题。
    • MoFu :大写 - 当然! @neil-mitchell :很高兴明确 - 谢谢。
    • 看起来像OverloadedStrings,您可能还需要显式类型签名。我刚才不得不这样做:{-# ANN validMonetaryChars ("HLint: ignore Use String" :: Text) #-}
    【解决方案2】:

    同意@MoFu 的解决方案。

    hlint 还支持使用参数忽略特定警告。

    hlint -i 'Use string literal' [filename]
    

    将此添加到参数或别名中,因此请忽略此警告,但不要破坏您的代码。

    顺便说一下,synatastic 支持论点。

    【讨论】:

    • 谢谢。我在 vim 中使用 hlint 和 ale,我想忽略有关重复的警告,所以我做了这样的事情:let g:ale_linters = { 'haskell': ['hlint -i "Reduce duplication"'],}
    【解决方案3】:

    使用最近 (>2019) 的 hlint,您可以使用更简单的语法 {- HLINT ignore "some hint" -}:

    module Test where
    
    import Data.Char(toUpper)
    
    {- HLINT ignore "Use string literal" -}
    main :: IO ()
    main = putStrLn ['a','b','c']
    

    ANN不同,它可以放在文件中的任何位置,如果使用OverloadedStrings,则无需注释为String,也不会导致编译时间增加。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 2013-11-15
      相关资源
      最近更新 更多