Algo que me sucede mucho durante la programación web: quiero ejecutar una operación que tenga una posibilidad de falla. En caso de falla, quiero enviar al cliente un 500. Normalmente, solo quiero seguir ejecutando una serie de pasos.Cómo "escapar temprano" en una mónada web
doSomeWebStuff :: SomeWebMonad()
doSomeWebStuff = do
res <- databaseCall
case res of
Left err -> status 500
Right val -> do
res2 <- anotherDatabaseCall (someprop val)
case res2 of
Left err -> status 500
Right val2 -> text $ show val2
dado que los errores son excepciones, no me gusta que necesite todo ese material para atraparlos. Quiero hacer lo mismo cada vez que quede algo. ¿Hay alguna manera de expresar eso en una línea con algo como guard
, pero controlar lo que devuelve en una salida?
en otro idioma que podía hacer esto:
function doSomeWebStuff() {
var res = databaseCall()
if (res == Error) return status 500
var res2 = anotherDatabaseCall(res.someprop)
if (res2 == Error) return status 500
return text(res2)
}
Por lo tanto, yo estoy bien escribiendo algunos repetitivo, pero no quieren que los errores a meterse con mi anidación, cuando es mucho más común que simplemente quiero continuar con el caso encontrado.
¿Cuál es la forma más limpia de hacer esto? Sé en teoría que puedo usar una mónada para salir temprano de una falla, pero solo he visto ejemplos con Maybe
y devolvería Nothing
al final, en lugar de dejar que especifique qué devuelve.
Un hermoso ejemplo de por qué leyes de las mónadas son útiles :) –
El 'mónada Either' se puede utilizar para la salida temprano con un valor de retorno (' Left'). – shang
@shang Hoy en día 'O bien el' error 'de e' es' error', es probable que produzca algunos efectos no deseados.Recomiendo ver 'ErrorT'. –