25

I have a unit test file:

module X04PatMatTest where

import AssertError
import Test.HUnit
import X04PatMat

...

and hlint complains:

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

for various reasons, I really want to put ['a', 'b', 'd'] in the test code.

I have tried various permuatations of

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

like putting the pragma as the first line of the file, after the module declaration, with the name module instead of X04..., changing the Warning to warn ...

What is the magic?

haroldcarr
  • 1,523
  • 15
  • 17

3 Answers3

25

You need to write the pragma in another way. After some trial and error I came up with the following:

module Test where

import Data.Char(toUpper)

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

note that you have to write "module" and not the name of the module

MoFu
  • 501
  • 4
  • 7
  • 1
    That works - thanks. The HLint documentation is not clear on this. For pragmas on functions it says: `{-# ANN myFunction "HLint: ignore" #-}` . For pragmas on modules it says: `{-# ANN module "HLint: ignore Eta reduce" #-}` so it was not clear to me if I should write `module` or something like `myModule`. – haroldcarr Oct 08 '13 at 05:44
  • @haroldcarr It is not explicitly stated, that's right. You can somehow derive it from the fact, that the first letter is lowercase and module names start with an uppercase letter. P.S. It would be nice, if you could accept my answer. – MoFu Oct 08 '13 at 12:44
  • 7
    I've updated the docs to read: {-# ANN module "HLint: ignore Eta reduce" #-} - ignore all eta reduction suggestions in this module (use module literally, not the name of the module). They are in git, but the docs link still takes you to the outdated darcs. I've raised a bug to fix that. – Neil Mitchell Oct 08 '13 at 14:30
  • MoFu : upper case - of course! @neil-mitchell : good to be explicit - thanks. – haroldcarr Oct 08 '13 at 21:05
  • 2
    Looks like with `OverloadedStrings`, you may also need an explicit type signature. I had to this just now: `{-# ANN validMonetaryChars ("HLint: ignore Use String" :: Text) #-}` – Jezen Thomas Jun 06 '19 at 08:23
4

With recent (>2019) hlint, you can use the simpler syntax {- HLINT ignore "some hint" -}:

module Test where

import Data.Char(toUpper)

{- HLINT ignore "Use string literal" -}
main :: IO ()
main = putStrLn ['a','b','c']

Unlike ANN, this can be placed anywhere in the file, and there's no need for annotating it as String if you use OverloadedStrings, and it will not lead to increased compile time.

unhammer
  • 4,306
  • 2
  • 39
  • 52
2

Agree with @MoFu's solution.

hlint also support ignore specific warning with arguments.

hlint -i 'Use string literal' [filename]

add this to arguments or aliases, so ignore this warning, but not break your code.

By the way, synatastic support arguments.

liuyang1
  • 1,575
  • 1
  • 15
  • 23
  • Thanks for this. I'm using hlint in vim with ale and I want to ignore warnings about duplication, so I did something like this: `let g:ale_linters = { 'haskell': ['hlint -i "Reduce duplication"'],}`. – Jezen Thomas Feb 24 '18 at 05:05