Как и другие предложили, Applicative
может быть приятно здесь, а также MaybeT
в зависимости от контекста. Третья вещь, которую вы можете иметь в виду, это то, что ошибка совпадения шаблона в блоке связывания .
Это то, что я хотел бы сделать:
loginCheck = do
ml <- getPostParam "login"
mp <- getPostParam "password"
fromMaybe (render "Msg" [("text", "Form incomplete")]) $
authAs <$> ml <*> mp
Или решение с MaybeT
, хотя и с другим значением возврата (опять больше контекста может показать, что это хороший подход, или нет):
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")])
... на самом деле выше, а фальшивый теперь, когда я смотрю на него
Я думаю, что ваш первый подход - самый чистый из партии. Это то, что я бы сделал, так или иначе :). –
+1 Когда я увидел требуемый тип логики, я сразу же подумал, что «от Майкла» + аппликации. Решение 'fromMaybe' очень чистое. Решение MaybeT неплохое; рефакторинг больших рядов кода для использования MaybeT может быть хорошим выбором в случае OP. –