{-# Language MultiParamTypeClasses, FlexibleContexts, FlexibleInstances, IncoherentInstances, TypeFamilies, PatternGuards, FunctionalDependencies #-}
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
main
= do print (monadConcat
[[[123]],[[345]],[[222],[3333,5555]]] :: [Int])
ey0jIExhbmd1YWdlIE11bHRpUGFyYW1UeXBlQ2xhc3NlcywgRmxleGlibGVDb250ZXh0cywgRmxleGlibGVJbnN0YW5jZXMsIEluY29oZXJlbnRJbnN0YW5jZXMsIFR5cGVGYW1pbGllcywgUGF0dGVybkd1YXJkcywgRnVuY3Rpb25hbERlcGVuZGVuY2llcyAjLX0KCmltcG9ydCBDb250cm9sLk1vbmFkCgpjbGFzcyBNb25hZENvbmNhdCBtIGEgYgoKICAgIHdoZXJlIG1vbmFkQ29uY2F0IDo6IGEgLT4gbSBiCgppbnN0YW5jZSAoTW9uYWQgbSwgTW9uYWRDb25jYXQgbSAobSBhKSBiKSA9PiBNb25hZENvbmNhdCBtIChtIChtIGEpKSBiCgogICAgd2hlcmUgbW9uYWRDb25jYXQgeCA9IHggPj49IG1vbmFkQ29uY2F0CgppbnN0YW5jZSAoTW9uYWQgbSwgYSB+IGIpID0+IE1vbmFkQ29uY2F0IG0gKG0gYSkgYgoKICAgIHdoZXJlIG1vbmFkQ29uY2F0ID0gaWQKCgptYWluID0gZG8gcHJpbnQgKG1vbmFkQ29uY2F0IFtbWzEyM11dLFtbMzQ1XV0sW1syMjJdLFszMzMzLDU1NTVdXV0gOjogW0ludF0pCiAgICAgICAgICBwcmludCAobW9uYWRDb25jYXQgWzIzNDVdIDo6IFtJbnRdKQogICAgICAgICAgCiAgICAgICAgICBwcmludCAobW9uYWRDb25jYXQgKEp1c3QgMTIzKSA6OiBNYXliZSBJbnQpCiAgICAgICAgICBwcmludCAobW9uYWRDb25jYXQgKEp1c3QgJCBKdXN0IDM0NSkgOjogTWF5YmUgSW50KQ==