Экзистенциальные типы и преобразователи монад

Контекст: я пытаюсь создать монаду ошибок, которая также отслеживает список предупреждений, примерно так:

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 ?

7
задан So8res 22 December 2011 в 18:49
поделиться