웹 프로그래밍 중에 나에게 많은 일이 일어납니다. 실패 할 가능성이있는 작업을 실행하고 싶습니다. 실패하면 클라이언트에게 500을 보내려고합니다. 일반적으로 일련의 단계를 계속 수행하기를 원합니다.웹 모나드에서 "빠른 탈출"방법
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
오류가 예외이기 때문에 나는 그 모든 것들을 잡으려고하고 싶지 않다. 왼쪽이 될 때마다 똑같은 일을하고 싶습니다. 한 줄에 guard
같은 것을 표현할 수있는 방법이 있습니까?하지만 출구에서 반환되는 내용을 제어 할 수 있습니까? 다른 언어에서
나는이 작업을 수행 할 수 있습니다 :
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)
}
그래서, 나는 몇 가지 상용구를 작성 확인 해요,하지만 그것은 단지에 훨씬 더 흔한 일 때, 내 중첩 엉망으로 오류를 원하지 않는다 발견 된 사건으로 계속 전진하고 싶다.
가장 확실한 방법은 무엇입니까? 나는 이론 상 모나드를 사용하여 실패 초기에 종료 할 수 있지만, 단지 Maybe
으로 예제를 보았고 반환 할 내용을 지정하는 대신 끝에 Nothing
을 반환합니다.
모나드 법률이 유용한 이유의 아름다운 예 : –
은'Either' 모나드는 반환 값 ('Left') 조기 종료에 사용할 수 있습니다. – shang
@shang 요즘에는 '어느 쪽인가'의'실패 '가'오류'인데, 이는 원치 않는 결과를 낳을 수 있습니다.나는'ErrorT'를 보길 권합니다. –