Điều gì đó xảy ra với tôi rất nhiều trong khi lập trình web: Tôi muốn chạy một thao tác có khả năng bị lỗi. Khi thất bại, tôi muốn gửi cho khách hàng 500. Thông thường, tôi chỉ muốn tiếp tục thực hiện một loạt các bước.Cách "thoát sớm" trong một trang web đơn lẻ
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
vì các trường hợp ngoại lệ là ngoại lệ, tôi không thích rằng tôi cần tất cả những thứ đó chỉ để bắt chúng. Tôi muốn làm điều tương tự bất cứ khi nào bất cứ điều gì là một trái. Có cách nào để thể hiện rằng trên một dòng với một cái gì đó như guard
, nhưng kiểm soát những gì nó trả về trên một lối ra?
Trong ngôn ngữ khác tôi có thể làm điều này:
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)
}
Vì vậy, tôi ok viết một số soạn sẵn, nhưng tôi không muốn các lỗi để gây rối với làm tổ của tôi, khi nó phổ biến hơn để chỉ muốn tiếp tục chuyển tiếp với trường hợp đã tìm thấy.
Cách sạch nhất để thực hiện việc này là gì? Tôi biết về mặt lý thuyết, tôi có thể sử dụng một đơn nguyên để thoát sớm khi thất bại, nhưng tôi chỉ thấy các ví dụ với Maybe
và nó sẽ trả lại Nothing
ở cuối, thay vì cho phép tôi chỉ định những gì nó trả về.
Ví dụ điển hình về lý do luật Monad hữu ích :) –
Có thể sử dụng đơn vị 'Hoặc 'để thoát sớm với giá trị trả lại (' Trái'). – shang
@shang Ngày nay '' e'' của 'e' là' lỗi', có khả năng sẽ tạo ra một vài hiệu ứng không mong muốn.Tôi khuyên bạn nên xem xét 'ErrorT'. –