상황 :이 같은 오류도 경고 목록을 추적 모나드, 뭔가를 생산하기 위해 노력하고있어 :실존 종류와 모나드 변압기
data Dangerous a = forall e w. (Error e, Show e, Show w) =>
Dangerous (ErrorT e (State [w]) a)
즉 Dangerous a
는 (Either e a, [w])
e
을 초래하는 작업입니다 표시 가능한 오류이며 w
이 표시됩니다.
문제는 내가 모든 것을 잘 실존 유형을 이해하지 못하는 대부분 때문에, 실제로 일을 실행할 수없는 것입니다. 관찰 :
runDangerous :: forall a e w. (Error e, Show e, Show w) =>
Dangerous a -> (Either e a, [w])
runDangerous (Dangerous f) = runState (runErrorT f) []
이 컴파일되지 않습니다, 때문에 : 내가 잃었어요
Could not deduce (w1 ~ w)
from the context (Error e, Show e, Show w)
...
`w1' is a rigidtype variable bound by
a pattern with constructor
Dangerous :: forall a e w.
(Error e, Show e, Show w) =>
ErrorT e (State [w]) a -> Dangerous a
...
`w' is a rigid type variable bound by
the type signature for
runDangerous :: (Error e, Show e, Show w) =>
Dangerous a -> (Either e a, [w])
. w1은 뭐니? 왜 그것이 ~ w
이라고 추론 할 수 없습니까?
더 나은 (또는 관용적 인) 방법이 있습니까? 나는 정말로 단지 약간의 경고와 함께 오는 오류 모나드를 원한다. – So8res
왜 형식을 '위험한 전자'로 정의하지 않는가? 당신이 달성하려고 노력하고있는 것을 이해한다면 여기에 존재할 필요가 없습니다. – ehird
나는 모두 자신의 오류와 경고를 던지며 최상위 레벨에서 처리되는 몇 개의 모듈을 가지고있다. 최상위 레벨 만 인쇄하면되지만, 옵션 모듈에서는'위험한 OptError OptWarning [Option]', 템플릿 파일에서는'위험한 TemplateError TemplateWarning Template'이 모두'show'n 일 때 말하기가 짜증납니다. 나는 많은 상용어를 제거하고 약간 무언가를 배우는 것을 시도하고있다, 확실하게 근본적이지 않다. – So8res