    module Lens.Family.Phantom where

    import Control.Applicative.Backwards (Backwards(..))
    import Control.Applicative (Const(..))
    import Data.Functor.Constant (Constant(..))
    import Data.Functor.Compose (Compose(..))

    class Functor f => Phantom f where
      coerce :: f a -> f b

    instance Phantom f => Phantom (Backwards f) where
      coerce (Backwards x) = Backwards (coerce x)

    instance Phantom (Const a) where
      coerce (Const x) = (Const x)

    instance Phantom (Constant a) where
      coerce (Constant x) = (Constant x)

    instance (Phantom f, Functor g) => Phantom (Compose f g) where
      coerce (Compose x) = Compose (coerce x)