Come altri hanno suggerito, Applicative
potrebbe essere bello qui, così come MaybeT
a seconda del contesto. Una terza cosa da tenere a mente è che un errore di corrispondenza del modello in un blocco do
chiama il numero fail
.
Questo è quello che vorrei fare:
loginCheck = do
ml <- getPostParam "login"
mp <- getPostParam "password"
fromMaybe (render "Msg" [("text", "Form incomplete")]) $
authAs <$> ml <*> mp
o una soluzione con MaybeT
, anche se uno con un valore di ritorno diverso (di nuovo più contesto potrebbe mostrare che questo è un buon approccio 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")])
... in realtà quanto sopra è piuttosto hokey, ora che lo guardo
Penso che il tuo primo approccio sia il più pulito del lotto. Questo è quello che farei comunque :). –
+1 quando ho visto il tipo di logica richiesta, ho immediatamente pensato a 'fromMaybe' + applicative. La tua soluzione 'fromMaybe' è molto pulita. La soluzione di MaybeT non è male; il refactoring di ampie porzioni di codice per utilizzare MaybeT potrebbe essere una buona scelta nel caso dell'OP. –