Como otros han sugerido, Applicative
podría ser agradable aquí, así como MaybeT
dependiendo del contexto. Una tercera cosa que debe tener en cuenta es que una falla de coincidencia de patrón en un enlace de bloque do
llama al fail
.
Esto es lo que haría:
loginCheck = do
ml <- getPostParam "login"
mp <- getPostParam "password"
fromMaybe (render "Msg" [("text", "Form incomplete")]) $
authAs <$> ml <*> mp
o una solución con MaybeT
, aunque con un valor de retorno diferente (otra vez más contexto podría mostrar que esto es un buen enfoque o no):
getPostParamT = MaybeT . getPostParam
loginCheckT = do
ml <- getPostParamT "login" -- ml and mp :: Maybe ByteString
mp <- getPostParamT "password"
liftIO $ authAs ml mp
<|> (liftIO $ render "Msg" [("text", "Form incomplete")])
... en realidad lo anterior es bastante hokey ahora que lo miro
Creo que su primer enfoque es el más limpio del lote. Eso es lo que haría, de todos modos :). –
+1 cuando vi el tipo de lógica requerida, inmediatamente pensé 'fromMaybe' + applicatives. Su solución 'fromMaybe' es muy limpia. La solución MaybeT no está mal; refactorizar grandes franjas de código para usar MaybeT podría ser una buena opción en el caso de OP. –