{-# Language MultiParamTypeClasses, FlexibleContexts, FlexibleInstances, IncoherentInstances, TypeFamilies, PatternGuards, FunctionalDependencies #-} import Control.Monad class MonadConcat m a b where monadConcat :: a -> m b instance (Monad m, MonadConcat m (m a) b) => MonadConcat m (m (m a)) b where monadConcat x = x >>= monadConcat instance (Monad m, a ~ b) => MonadConcat m (m a) b where monadConcat = id main = do print $ monadConcat [[[123]],[[345]],[[222],[3333,5555]]] print $ monadConcat [2345] print $ monadConcat (Just 123) print $ monadConcat (Just $ Just 345)