Подтвердить что ты не робот

Ghc-7.10: Аргумент, не относящийся к переменной типа (используйте это для использования FlexibleContexts)

Я пытался использовать ghc-7.10 (RC 2) и получил это сообщение в ряде случаев, например,

src/Text/Regex/XMLSchema/Generic/RegexParser.hs:439:5:
    Non type-variable argument
      in the constraint: Text.Parsec.Prim.Stream s m Char
    (Use FlexibleContexts to permit this)
    When checking that ‘prop’ has the inferred type
      prop :: forall s u (m :: * -> *) (t :: * -> *).
              (Foldable t, Text.Parsec.Prim.Stream s m Char) =>
              Char -> t Char -> Text.Parsec.Prim.ParsecT s u m [Char]
    In an equation for ‘isCategory'’:
        isCategory'
          = (foldr1 (<|>) . map (uncurry prop)
             $ [('L', "ultmo"), ('M', "nce"), ('N', "dlo"), ....])
            <?> "illegal Unicode character property"
          where
              prop c1 cs2
                = do { _ <- char c1;
                       .... }
Failed to install hxt-regex-xmlschema-9.2.0

Это должно быть то, что вводится новым ghc, или новой базой, которая поставляется вместе с ним, или новым парсеком (3.1.8), поскольку он работал раньше.

фрагмент исходного кода:

isCategory'     :: Parser String
isCategory'
    = ( foldr1 (<|>) . map (uncurry prop) $
        [ ('L', "ultmo")
        , ('M', "nce")
        , ('N', "dlo")
        , ('P', "cdseifo")
        , ('Z', "slp")
        , ('S', "mcko")
        , ('C', "cfon")
        ]
      ) <?> "illegal Unicode character property"
    where
    prop c1 cs2
        = do
          _ <- char c1
          s2 <- option ""
                ( do
                  c2 <- satisfy (`elem` cs2)
                  return [c2] )
          return $ c1:s2

Примечание. Я не спрашиваю об этом конкретном libray (hxt- *), так как я заметил это и в других местах.

4b9b3361

Ответ 1

Это было изменение, внесенное в GHC 7.10.1-rc1:

Теперь GHC проверяет, что все языковые расширения, необходимые для сигнатур предполагаемого типа, явно включены. Это означает, что если какая-либо из сигнатур типа, выведенная в вашей программе, требует некоторого расширения языка, вам необходимо включить ее. Мотивация заключается в том, что добавление отсутствующей сигнатуры типа, выведенной GHC, должно давать программу, которую typechecks. Раньше это было не так.

Это потрясающее изменение. Код, который использовался для компиляции в прошлом, может завершиться ошибкой с сообщением об ошибке, требующим определенного расширения языка (скорее всего, -XTypeFamilies, -XGADTs или -XFlexibleContexts).

Ответ 2

Я получил эту ошибку после настройки barebone Snap-приложения, как описано здесь.

Строковые операции, такие как "" ++ "" или "Haskell" !! 2, были повреждены. При поиске файла Haskell из GHCI я получил вариант этой ошибки:

Нет экземпляра для (Data.String.IsString [a0])       вытекающие из литерала "my string"' The type variable a0 ', неоднозначны     Соответствующие привязки включают myString:: [a0] (привязанные к myFile.hs: 11:1)     Примечание: имеется потенциальный экземпляр:       instance Data.String.IsString [Char] - Определено в переменной Data.String' In the expression: "my string" In an equation for: variable = "my string"

Решение:

Чтобы исправить это, нужно удалить строку :set -XOverloadedStrings из файла .ghci в моем проекте и перезапустить GHCI.

Ответ 3

У меня такая же проблема с моим кодом, часть его, которая использует Parsec и часть этого, которая этого не делает. Большинство из них указывают на функции без подписей в блоке where.

Решение, которое работает для меня, заключается в том, чтобы добавить явные подписи для функций, где вы можете использовать выводимый тип, который вы получаете от ошибки, по большей части, но вместо того, чтобы хранить типы, такие как ParsecT s u m [Char] generic, я предоставляю конкретный тип Я хочу, например Parsec String () [Char].