Haskell Either Applicative where the Left is a Monoid
Your Functor instance doesn't need a to be a Monoid. We can remove that constraint to make fmap on EitherLeftMonoid more general.

Your Applicative instance could be made a little bit more readable if you provide a fromLefty :: Monoid a =&gt; EitherLeftMonoid a b -&gt; a function:

instance Functor (EitherLeftMonoid a) where
  fmap _ (Lefty a)  = Lefty a
  fmap f (Righty b) = Righty (f b)

instance Monoid a =&gt; Applicative (EitherLeftMonoid a) where
  pure                  = Righty
  Righty f &lt;*&gt; Righty x = Righty (f x)
  x        &lt;*&gt; y        = Lefty $ fromLefty x `mappend` fromLefty y

fromLefty :: Monoid a =&gt; EitherLeftMonoid a b -&gt; a
fromLefty (Left x) = x
fromLefty _        = mempty


With fromLefty we can take advantage of mappend mempty x = x = mappend x mempty.



In this case everything is in a single module and everything gets exported. This enables a user to use the Person constructor immediately. If you want to prevent that you need to make sure that only the type, but neither the records nor the data constructor get exported. Otherwise mkPerson can get circumvented.