{-# 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 source1 :: [[[Int]]] source1 = [[[123]],[[345]],[[222],[3333,5555]]] source2 :: [Int] source2 = [2345] --result1 :: [Int] result1 = monadConcat source1 --result2 :: [Int] result2 = monadConcat source2 main = do print $ result1 print $ result2