Skip to content

warn-unused-imports does not detect coercions

When using coerce, GHC can erroneously warn that imports are unnecessary. For example:

Foo.hs

module Foo (MT(..), M) where

import Control.Monad.Identity

newtype MT m b = MT (m b)
type M b = MT Identity b

Main.hs

import Control.Monad.Identity
import Data.Coerce
import Foo

foo :: M [a] -> MT [] a
foo = coerce

GHC (with -fwarn-unused-imports) warns

Main.hs:1:1: Warning:
    The import of ‘Control.Monad.Identity’ is redundant
      except perhaps to import instances from ‘Control.Monad.Identity’
    To import instances alone, use: import Control.Monad.Identity()

But this is incorrect: we need the constructor Identity to be in scope in order for the coercion to succeed. Thus the import is not redundant, nor is it needed to (only) import instances. In particular, the two implied suggestions

  1. remove the import in Main.hs altogether
  2. change the import in Main.hs to import Control.Monad.Identity ()

both (correctly) result in compile errors.

At a minimum, the warning message should be updated to include this possibility, but it would be even better if GHC could detect this and not throw a warning at all.

Edited by Ben Gamari
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information