{-# LANGUAGE FlexibleInstances #-} {- needs to mapping F1 ----> G1 F2 ----> G2 F3 ----> G3 -} data F1 = F1 data F2 = F2 data F3 = F3 data G = G1 | G2 | G3 deriving (Show) data Wrapper a = Wrapper a data Mapping r = GF1 !(Wrapper F1) | GF2 !(Wrapper F2) | GF3 !(Wrapper F3) class ToMapping a where toMapping :: a -> Mapping a toG :: Mapping a -> G toG (GF1 _) = G1 toG (GF2 _) = G2 toG (GF3 _) = G3 instance ToMapping F1 where toMapping x = GF1 $ Wrapper x instance ToMapping F2 where toMapping x = GF2 $ Wrapper x instance ToMapping F3 where toMapping x = GF3 $ Wrapper x convert :: ToMapping a => a -> G convert = toG . toMapping