import Data.Constraint (Dict(..), withDict) import qualified Data.ByteString as BS data DBEntry = DBEntry { siteVariant :: SiteVariant , html :: BS.ByteString } data SiteVariant = A | B data SiteA = SiteA data SiteB = SiteB -- | all sites to be transformed into General data General = General class IntoGeneral a where fromHTML :: Dict (IntoGeneral a) -> BS.ByteString -> General instance IntoGeneral SiteA where fromHTML _ = undefined -- | Depending on `siteVariant` in `DBEntry`, `fromHTML` is calibrated with Proxy fromDBEntry :: Dict (IntoGeneral a) -> DBEntry -> General fromDBEntry dict (DBEntry siteVariant html) = case siteVariant of A -> withDict dict (@SiteA) $ fromHTML html B -> withDict dict SiteB $ fromHTML html -- Question: how to make fromDBEntry work?