{-# 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)