型クラスのパラメタ多相?

Either a b(但しaとbは何らかの共通の制約を持つ)に適用できる f g = either g g という関数を書こうとしたが,書けなかった.特定の型クラスに限定すれば書くことができる.

{-# LANGUAGE RankNTypes #-}

fshow :: (Show a, Show b) => (forall c. (Show c) => c -> d) -> Either a b -> d
fshow g = either g g

feq :: (Eq a, Eq b) => (forall c. (Eq c) => c -> d) -> Either a b -> d
feq g = either g g

-- f :: (k a, k b) => (forall c. (k c) => c -> d) -> Either a b -> d
-- f g = either g g
-- => malformed class assertion

g h = print $ map h [Left 42, Right 'a']

main = g (fshow show) >>
       g (feq (\x -> x == x))

Show や Eq のところをパラメタにすればよさそうに思ったのだけど,GHCではコンパイルエラーになってしまった.一体どうすれば…