fork(2) download
{-# 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)
Success #stdin #stdout 0s 4516KB
stdin
Standard input is empty
stdout
[123,345,222,3333,5555]
[2345]
Just 123
Just 345