added an error type that's half monad