일부 상태 정보 (로깅 등)를 추적하기 위해 StateT
모나드 변환기를 사용하는 코드를 작성 중입니다.실패 할 때 정보를 보존하는 방법?
내가 StateT
에 전달하고있어 모나드는 매우 간단합니다 :
data CheckerError a = Bad {errorMessage :: Log} | Good a
deriving (Eq, Show)
instance Monad CheckerError where
return x = Good x
fail msg = Bad msg
(Bad msg) >>= f = Bad msg
(Good x) >>= f = f x
type CheckerMonad a = StateT CheckerState CheckerError a
그것은 단지 Left
및 Right
변형입니다.
무슨 문제가 있습니까? fail
의 정의입니다. 필자의 계산에서 나는이 모나드 내부에 많은 정보를 생성하고 실패 할 때에도이 정보를 유지하고자한다. 현재 내가 할 수있는 일은 모든 것을 으로 변환하고 에 인수로 전달 된 String
으로 Bad
인스턴스를 생성하는 것입니다. 내가 지금까지 시도
fail msg = do
info <- getInfoOutOfTheComputation
return $ Bad info
그러나 모든이 다른 모나드를 혼합 것 아마 때문에, 오류를 입력 제공 : 내가하고 싶은 무엇
은 같은 것입니다.
String
으로 변환하지 않고도 필요한 정보를 보존하기 위해 fail
을 구현할 수 있습니까?
나는 최선의 하스켈이 show
+ read
을 사용하여 문자열로 모든 정보를 fail
으로 전달한다고 믿을 수 없다.
짧은 대답 : 그것은 '실패'가 아니라, 당연히 작동하지 않습니다. – Carl
@Carl 그럼 어떻게해야하는지 보여주세요. 내가 원하는 것 : 1) 나쁜 일이 발생할 때 계산을 "중지"하는 방법 2) 그 시점까지 생성 된 상태 정보를 보존합니다. 필자가 보았던 모든 예제는'fail'을 1 회 사용하고 2 번을 달성하지 못한다. 현재 나와있는 유일한 방법은'prettyFail = do state <- get; 모든 상태 정보에서'Show $'상태를''show''및''Read ''를 구현하지 못했습니다. – Bakuriu
'fail'은 do 표기법의 패턴 일치 실패를 지원하기위한 임시 방편 조치로만 사용됩니다. –