Контекст: я пытаюсь создать монаду ошибок, которая также отслеживает список предупреждений, примерно так:
data Dangerous a = forall e w. (Error e, Show e, Show w) =>
Dangerous (ErrorT e (State [w]) a)
ie Dangerous a
- это операция, приводящая к (Either ea, [w])
, где e
- отображаемая ошибка, а w
- showable.
Проблема в том, что я не могу на самом деле запустить это, в основном потому, что я не очень хорошо понимаю экзистенциальные типы. Заметьте:
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
?