Ошибка компиляции при попытке использовать экзистенциальные типы в Haskell - PullRequest
3 голосов
/ 13 февраля 2012

Я получаю сообщение об ошибке, например:

Linear.hs:215:27:
    Couldn't match expected type `forall v1.
                                  Ident v1 =>
                                  SubstT v1 (GenericLL (a v1 c)) n x'
                with actual type `forall v1. Ident v1 => SubstT v1 a0 m0 b0'
    Expected type: (forall v1.
                    Ident v1 =>
                    SubstT v1 (GenericLL (a v1 c)) n x)
                   -> n x
      Actual type: (forall v1. Ident v1 => SubstT v1 a0 m0 b0) -> m0 b0
    In the first argument of `flattenImpl', namely `runSubstT'
    In the expression: flattenImpl runSubstT

Фактический тип выглядит более общим, чем ожидаемый. Каковы возможные причины появления такого сообщения об ошибке? Сообщение вводит в заблуждение или я его неправильно читаю?

Я пытаюсь передать экзистенциально количественную функцию runSubstT, тип которой:

runSubstT :: (Monad m) => (forall v. (Ident v) => SubstT v a m b) -> m b

Я также остановлюсь на некотором хорошем описании того, как компилятор GHC выполняет сопоставление типов для экзистенциально квантованных типов.

1 Ответ

1 голос
/ 13 февраля 2012

У меня есть предположение, но я не могу быть уверен, пока вы не напишите достаточно кода, чтобы воспроизвести ошибку.Я думаю, основываясь на этом:

runSubstT :: (Monad m) => (forall v. (Ident v) => SubstT vamb) -> mb

заключается в том, что зависимость второго типа 'a' от первого экзистенциального типа 'v' может быть проблемой.Ожидаемый тип:

для v1.Ident v1 => SubstT v1 (GenericLL (a v1 c)) n x '

заменяет второй тип на (GenericLL (a v1 c)), который зависит от первого экзистенциального типа' v1 '.Это может быть причиной конфликта, но без кода я не могу отследить логин проверки типов.

...