{-# 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]]] :: [Int]) print (monadConcat [2345] :: [Int]) print (monadConcat (Just 123) :: Maybe Int) print (monadConcat (Just $ Just 345) :: Maybe Int)