Như những người khác đã gợi ý, Applicative
có thể được tốt đẹp ở đây, cũng như MaybeT
tùy thuộc vào ngữ cảnh. Điều thứ ba bạn có thể lưu ý là lỗi khớp mẫu trong một cuộc gọi ràng buộc chặn do
fail
.
Đây là những gì tôi sẽ làm:
loginCheck = do
ml <- getPostParam "login"
mp <- getPostParam "password"
fromMaybe (render "Msg" [("text", "Form incomplete")]) $
authAs <$> ml <*> mp
Hoặc một giải pháp với MaybeT
, mặc dù một với một giá trị trả về khác nhau (bối cảnh một lần nữa hơn có thể hiển thị này là một cách tiếp cận tốt hay không):
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")])
... thực sự ở trên là khá hokey bây giờ mà tôi nhìn vào nó
Tôi nghĩ rằng cách tiếp cận đầu tiên của bạn là sạch nhất của lô. Đó là những gì tôi sẽ làm, dù sao đi nữa :). –
+1 khi tôi nhìn thấy loại logic cần thiết, tôi ngay lập tức nghĩ rằng 'fromMaybe' + ứng dụng. Giải pháp 'fromMaybe' của bạn rất sạch sẽ. Giải pháp MightT không phải là xấu; refactoring swaths lớn hơn của mã để sử dụng MaybeT có thể là một lựa chọn tốt trong trường hợp của OP. –