ndmitchell/hlint

Incorrect "Use map" when folding over a `Foldable`

Open

#1,601 opened on May 29, 2024

View on GitHub
 (1 comment) (0 reactions) (0 assignees)Haskell (208 forks)batch import
good first issue

Repository metrics

Stars
 (1,594 stars)
PR merge metrics
 (No merged PRs in 30d)

Description

The code

triggersUseMap :: Foldable f => f a -> [a]
triggersUseMap = foldr (\k acc -> identity k : acc) []

-- to get rid of "Avoid lambda" and "Redundant id"
identity :: a -> a
identity = id

triggers the hint

                        Warning: Use map
Found:
  foldr (\ k acc -> identity k : acc) []
Perhaps:
  map (\ k -> identity k)

but obviously triggersUseMap = map (\k -> identity k) does not compile, since map wants a list and the argument is a general Foldable.

The same warning is not emitted with the eta reduced version:

noHint :: Foldable f => f a -> [a]
noHint = foldr ((:) . identity) [] -- no hint even with foldr (:) []

This is using GHC 9.6.5 with HLint 3.6.1 (apologies if this was already fixed in 3.8, but I didn't see anything of the sort in the changelog)

Contributor guide