Haskell:如何告诉hlint不要:`警告:使用字符串文字`

har*_*arr 15 haskell hlint

我有一个单元测试文件:

module X04PatMatTest where

import AssertError
import Test.HUnit
import X04PatMat

...
Run Code Online (Sandbox Code Playgroud)

和hlint抱怨:

X04PatMatTest.hs:15:69: Warning: Use string literal 
Found:
  ['a', 'b', 'd']
Why not:
  "abd"
Run Code Online (Sandbox Code Playgroud)

由于各种原因,我真的想要['a', 'b', 'd']输入测试代码.

我尝试了各种各样的permuatations

{-# ANN X04PatMatTest "HLint: ignore Warning: Use string literal" #-}
Run Code Online (Sandbox Code Playgroud)

比如将pragma作为文件的第一行,在模块声明之后,用名称module代替X04...,将... 更改Warningwarn...

什么是魔术?

MoF*_*oFu 19

你需要以另一种方式编写pragma.经过一些试验和错误,我想出了以下内容:

module Test where

import Data.Char(toUpper)

{-# ANN module "HLint: ignore Use string literal" #-}
main :: IO ()
main = putStrLn ['a','b','c']
Run Code Online (Sandbox Code Playgroud)

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

  • 我已将文档更新为:{ - #ANN模块"HLint:忽略Eta reduce"# - } </ tt> - 忽略此模块中的所有eta减少建议(使用<tt> module </ tt>字面意思,不是模块的名称).他们是git,但文档链接仍然带你到过时的darcs.我提出了一个错误来解决这个问题. (5认同)
  • 看起来像`OverloadedStrings`,你可能还需要一个显式的类型签名。我刚才不得不这样做:`{-# ANN validMonetaryChars ("HLint: ignore Use String" :: Text) #-}` (2认同)

unh*_*mer 6


使用最近的(>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']
Run Code Online (Sandbox Code Playgroud)

与 不同的是ANN,它可以放在文件中的任何位置,并且不需要像String使用那样对其进行注释OverloadedStrings,并且不会导致编译时间增加。