하스켈에서 오류를 처리하기 위해 다음과 같은 모나드 변환기가 있습니다. 나는 사용자 정의 클래스와 Error
를 인스턴스화하고 오류를 처리하는 기준에 매우 유연한 수단을 가질 수하스켈 모나드와 문자열을 필요로하지 않는 실패
instance (Monad m, Error e) => Monad (EitherT e m) where
return = EitherT . return . return
m >>= k = EitherT $ do
a <- runEitherT m
case a of
Left l -> return (Left l)
Right r -> runEitherT (k r)
fail = EitherT . return . Left . strMsg
그것은 꽤 잘 작동합니다.
fail
은 다소 어리 석으며, 유형이 String -> EitherT e m
이고 String
제한은 오류를 만드는 성가신 방법 일 수 있습니다. 나는 한꺼번에 많이와 끝까지 : 내가하고 싶은 무엇
instance Error BazError where
strMsg "foo" = FooError -- oh look we have no error context
strMsg "bar" = BarError -- isn't that nice
은 내가 (Error e)
제한을 제거 할 수 있도록 유형 a -> e
이며, fail
같은 새로운 기능을 만드는 것입니다. fail
는 모나드 스택이 덜 제한적인 유형 fail
과 같은 동작이있는 함수를 만들 수있는 방법이 있나요 내가
EitherT BazError (StateT [BazWarning] IO) Foo
끝낼 때처럼 커질 때 특히 편리하다? 또는 deep haskell dark magic을 사용하여 fail
을 구현 했습니까? 당신이 할 일 블록의 패턴 일치 고장이있는 경우 Just x <- something
을 가지고있는 경우 something
의 결과가 Nothing
처럼
실패한'do'-block 패턴 일치에 대한 동작을 사용자 정의하지 않으려면'fail' 만 피하십시오. – ehird