use Alternative instead of MonadPlus