2014-10-14 3 views
2

나는 this question을 읽었습니다. 이 인스턴스 한편 GHC (7)와 함께 제공 기본 4.3.xx에 추가되었습니다모나드 또는 ErrorT 모나드 trasformer를 사용해야합니까?

, 당신은 당신이 뭔가를 표현하기 위해 Either를 사용하는 경우, 직접 Either 인스턴스를 사용하거나 할 수 있습니다 : 여기 허용 대답의 인용이다 당신이 실패 할 수도 있습니다 ErrorT 모나드 변압기를 사용해야합니다.

는이 같은 뭔가를 Either를 사용하려면 : 계산의 한 부분이 실패 할 경우

> (Left "bad thing happened") >>= \x -> Right (x ++ " ...") 
Left "bad thing happened" 

그래서, 그 Left가 반환됩니다.

실제 질문은 Either 모나드가 아닌 ErrorT 모나드 트랜스포머를 사용해야하는 이유는 무엇입니까? 나는 하스켈의 초심자이며, 특히 모나드 변압기를 두려워하고있다. 특히 내가 이미 코드를 작성하고있을 때 그렇다.

답변

4

케이스에 맞는 경우 Either을 사용하는 것이 좋습니다. 당신이 당신의 계산의 중간에 일부 IO을 수행하려는 경우가 이 충분하지 않을 경우의 예는 예를 들어, 다음과 같습니다

이 경우
x <- mightReturnLeft 
y <- liftIO someIOAction 
useXandY x y 

, Either는 충분하지 않습니다,하지만 ErrorT 작동 것 .

또한 ErrorT 대신 ExceptT을 사용하는 것이 좋습니다. ErrorTError 클래스를 사용하므로 사용하기가 더 어려워집니다.

+0

예를 들어, IO 모나드가 단방향 모나드이기 때문에 모나드 변압기를 사용해야합니다. 'EitherT' 변압기가 있습니까? 'ExceptT'는'EitherT'처럼 작동합니까? – Mark

+0

제 이해는 ExceptT가 변압기와 MTL에 의해 '축복받은'EitherT라는 것입니다. 나는 왜 EitherT가 외부인인지 모르지만 나는 ExceptT라는 이름을 더 좋아한다. – user239558

+0

@Mark 실제로 나는 어느 쪽의 패키지에서나'EitherT'를 사용하게 될 것입니다 (http://haddocks.fpcomplete.com/fp/7.8/20140916-162/either/Control-Monad-Trans-Either.html).) 그것은 더 오랫동안 주변에 있었기 때문에. 이 둘은 기능적으로 동일합니다. 내 응답에서'ExceptT'를 참조했는데 왜냐하면'transformers'에서 나온 것이기 때문에'ErrorT'가 더 이상 사용되지 않습니다. –