data MsgWrapper a = MsgWrapper { payload :: a } data FooMsg = FooMsg {} data BarMsg = BarMSg {} parseFooMsg :: MsgWrapper FooMsg -> IO () parseFooMsg (MsgWrapper fooMsg) = do putStrLn "Parsing FooMsg..." -- Parse FooMsg here parseBarMsg :: MsgWrapper BarMsg -> IO () parseBarMsg (MsgWrapper barMsg) = do putStrLn "Parsing BarMsg..." -- Parse BarMsg here -- fake eitherDecode like Aeson.eitherDecode fakeDecode :: String -> Either String a fakeDecode = error "unimpl" main :: IO () main = case fakeDecode "some json" of Right (msg :: MsgWrapper FooMsg) -> parseFooMsg msg Right (msg :: MsgWrapper BarMsg) -> parseBarMsg msg Left err -> putStrLn $ "Error decoding message: " ++ err