fromMaybe package:foldl

instance Monad m => Semigroup (FromMaybe m a) where
mappend (FromMaybe f) (FromMaybe g) = FromMaybeM (f . Just . g)