import Data.Monoid import Data.Functor import Control.Applicative newtype NT m a = NT (m a) deriving (Eq,Show) instance (Monoid a, Applicative m) => Monoid (NT m a) where mempty = NT $ pure mempty mappend (NT a) (NT b) = NT $ mappend <$> a <*> b main = do print $ (NT (Just "a") <> NT (Just "b")) <> NT (Just "c") print $ NT (Just "a") <> (NT (Just "b") <> NT (Just "c")) print $ (NT ["a"] <> NT ["b"]) <> NT ["c"] print $ NT ["a"] <> (NT ["b"] <> NT ["c"]) print $ (NT (Just $ NT ["a"]) <> NT (Just $ NT ["b"])) <> NT (Just $ NT ["c"]) print $ NT (Just $ NT ["a"]) <> (NT (Just $ NT ["b"]) <> NT (Just $ NT ["c"]))